? ? ? ? ? ? ? ?最近在寫(xiě)項(xiàng)目中的Demo,下個(gè)項(xiàng)目中有IM的需求,其中有個(gè)語(yǔ)音消息的功能,網(wǎng)上github上找了開(kāi)源的SDK,但是老大要求完全自制,那沒(méi)辦法,只能自己寫(xiě)了。
了解MediaRecorder
? ? ? ? ? ? ? ? ? MediaRecorder是google針對(duì)麥克風(fēng)硬件提供的相對(duì)應(yīng)的類(lèi),使用非常方便,有興趣的可以去看看這個(gè)MediaRecorder,介紹非常詳細(xì)使用起來(lái)也是非常簡(jiǎn)單,
? 首先 new一個(gè)對(duì)象
? MediaRecorder ? mMediaRecorder=new MediaRecorder();
? 然后做一些固定的設(shè)置
mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
? ? ? 以上三個(gè)設(shè)置 是必須要的,第一個(gè)是設(shè)置采集源,設(shè)置為麥克風(fēng);第二工人是設(shè)置音頻文件的輸出格式,我選的默認(rèn),這樣就會(huì)根據(jù)第三個(gè)設(shè)置的編碼格式一樣,第三個(gè)我選的amr,因?yàn)槭亲稣Z(yǔ)音,我沒(méi)試過(guò)別的模式,但微信的語(yǔ)音是這個(gè),先試試這個(gè)吧,有時(shí)間再試試別的格式
filePath=FolderPath+ TimeUtils.getCurrentTime() +".amr";
mMediaRecorder.setOutputFile(filePath);
mMediaRecorder.setMaxDuration(1000*60*10);
mMediaRecorder.prepare();
? ? ?以上兩個(gè)設(shè)定,第二行是設(shè)定錄音文件的保存路徑,為了不覆蓋,我加了時(shí)間戳,第三行設(shè)設(shè)定錄音文件的最大時(shí)長(zhǎng)。最后一句,表明設(shè)定完成,可以開(kāi)始錄音了。
以上就是完整的設(shè)定了,然后就可以拿來(lái)用了
mMediaRecorder.start();//開(kāi)始錄音
? 需要錄音過(guò)程中的回調(diào)什么的 ?都寫(xiě)在這里,最好加個(gè)時(shí)間戳 跟結(jié)束后的時(shí)間戳對(duì)比,這樣可以拿到時(shí)長(zhǎng)。
然后還有取消跟停止功能
取消
public voidcancelRecord(){
mMediaRecorder.stop();
mMediaRecorder.reset();
mMediaRecorder.release();
mMediaRecorder=null;
File file =newFile(filePath);
if(file.exists())
file.delete();
filePath="";
}
? ? ?這是取消,除了調(diào)用 stop()方法外,還要 調(diào)用reset() release()方法,然后mMediaRecorder置空 同時(shí)清除已保存的錄音文件,這樣才可以完整的取消。不過(guò)既然mMediaRecorder.reset()然后=null ?下次調(diào)用就要重新new 然后重新set屬性。
? ? 停止的方法類(lèi)似,不過(guò)不用刪除已保存的錄音文件,另外如果有需要回調(diào)的地方,也可以寫(xiě)在stop之后,比如回調(diào)一下文件路徑什么的
public longstopRecord() {
mMediaRecorder.stop();
mMediaRecorder.reset();
mMediaRecorder.release();
mMediaRecorder=null;
filePath="";
returnendTime-startTime;
}
主要的方法就完成了,其實(shí)我是寫(xiě)了一個(gè)類(lèi),這樣用起來(lái)方便