Android录音amr实时转成MP3格式
文章目錄
- MP3 錄音使用說(shuō)明
- 步驟一:下載NDK,并配置(Mac)
- 步驟二:修改C代碼相關(guān)路徑,編譯成so庫(kù)
- 步驟三:應(yīng)用層代碼代碼調(diào)用系統(tǒng)AudioRecord類開始錄音
- 開始錄音 start()
- 步驟四:在錄音過程中實(shí)時(shí)轉(zhuǎn)成MP3格式
- 步驟五:停止錄音
MP3 錄音使用說(shuō)明
資源信息下載
鏈接:https://pan.baidu.com/s/1m-HqA88udn-N_kNgOtoA_Q
提取碼:8x3e
jni:音頻轉(zhuǎn)成MP3格式的C庫(kù),將類名或者路徑名改成自己項(xiàng)目路徑,通過NDK生成so庫(kù)。(建議把jni文件夾同時(shí)也拷貝至 mp3library 模塊下面)
mp3library:錄音、格式轉(zhuǎn)換的Library,包括so庫(kù)和工具類。
步驟一:下載NDK,并配置(Mac)
1.下載地址:http://tools.android-studio.org/
2.解壓后,配置環(huán)境變量
步驟二:修改C代碼相關(guān)路徑,編譯成so庫(kù)
將jni目錄拷貝至 mp3library 依賴模塊中的根目錄下
將C代碼中路徑改成自己庫(kù)(so庫(kù)所在的位置)的路徑,cd進(jìn)入jni目錄下,運(yùn)行ndk-build 命令生成so庫(kù),之后將編譯成功的libs文件下面的so庫(kù)拷貝到自己的項(xiàng)目中。
步驟三:應(yīng)用層代碼代碼調(diào)用系統(tǒng)AudioRecord類開始錄音
try {String path = recAudioDir(recordFilePath).getAbsolutePath();recFile = new File(path, System.currentTimeMillis() + ".mp3");// 初始化錄音工具類(mp3library庫(kù)中),傳入錄音保存的路徑mRecorder = new MP3Recorder(recFile);// 開始錄音mRecorder.start();} catch (Exception e) {e.printStackTrace();}}AndioRecord 類的主要功能是讓各種JAVA應(yīng)用能夠管理音頻資源,以便它們通過此類能夠錄制平臺(tái)的聲音輸入硬件所收集的聲音。此功能的實(shí)現(xiàn)就是通過 “pulling同步” AudioRecord對(duì)象的聲音數(shù)據(jù)來(lái)完成的。在錄音過程中,應(yīng)用所需要做的就是通過 read 方法去及時(shí)地獲取 AudioRecord 對(duì)象的錄音數(shù)據(jù). AudioRecord 類提供的三個(gè)獲取聲音數(shù)據(jù)的方法分別是read(byte[], int, int), read(short[], int, int), read(ByteBuffer, int). 無(wú)論選擇使用那一個(gè)方法都必須事先設(shè)定方便用戶的聲音數(shù)據(jù)的存儲(chǔ)格式。
開始錄音的時(shí)候,一個(gè) AudioRecord 需要初始化一個(gè)相關(guān)聯(lián)的聲音 buffer, 這個(gè) buffer 主要是用來(lái)保存新的聲音數(shù)據(jù)。這個(gè)buffer 的大小,我們可以在對(duì)象構(gòu)造期間去指定。它表明一個(gè) AudioRecord 對(duì)象還沒有被讀取(同步)聲音數(shù)據(jù)前能錄多長(zhǎng)的音(即一次可以錄制的聲音容量)。一般情況下錄音實(shí)現(xiàn)的簡(jiǎn)單流程如下:
- 創(chuàng)建一個(gè)數(shù)據(jù)流
- 構(gòu)造一個(gè) AudioRecord 對(duì)象,其中需要的最小錄音緩存 buffer 大小可以通過 getMinBufferSize 方法得到。如果 buffer 容量過小,將導(dǎo)致對(duì)象構(gòu)造的失敗
- 初始化一個(gè)buffer,該buffer大于等于 AudioRecord 對(duì)象用于寫聲音數(shù)據(jù)的 buffer 大小
- 開始錄音
- 從 AudioRecord 中讀取聲音數(shù)據(jù)到初始化 buffer ,將 buffer 中數(shù)據(jù)導(dǎo)入數(shù)據(jù)流
- 停止錄音
- 關(guān)閉數(shù)據(jù)流
開始錄音 start()
public void start() throws IOException {//以地址的方式獲取frameCount的值。最小緩沖區(qū)的大小mBufferSize = AudioRecord.getMinBufferSize(DEFAULT_SAMPLING_RATE,DEFAULT_CHANNEL_CONFIG, DEFAULT_AUDIO_FORMAT.getAudioFormat());/** 初始化 AudioRecord* DEFAULT_AUDIO_SOURCE: 音源 MediaRecorder.AudioSource.MIC 本機(jī)的聲音* DEFAULT_SAMPLING_RATE: 采樣率 44100,模擬器僅支持從麥克風(fēng)輸入8kHz采樣率* DEFAULT_CHANNEL_CONFIG:錄音的聲道數(shù),當(dāng)前設(shè)置的 16* DEFAULT_AUDIO_FORMAT: 錄音的比特?cái)?shù),當(dāng)前設(shè)置的 PCMFormat.PCM_16BIT* mBufferSize: 期望錄音時(shí)系統(tǒng)為其提供的緩沖區(qū)大小*/mAudioRecord = new AudioRecord(DEFAULT_AUDIO_SOURCE,DEFAULT_SAMPLING_RATE, DEFAULT_CHANNEL_CONFIG, DEFAULT_AUDIO_FORMAT.getAudioFormat(),mBufferSize);mPCMBuffer = new short[mBufferSize];mAudioRecord.startRecording();new Thread() {@Overridepublic void run() {//設(shè)置線程權(quán)限android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_URGENT_AUDIO);while (mIsRecording) {int readSize = mAudioRecord.read(mPCMBuffer, 0, mBufferSize);if (readSize > 0) {mEncodeThread.addTask(mPCMBuffer, readSize);calculateRealVolume(mPCMBuffer, readSize);}}mAudioRecord.stop();mAudioRecord.release();mAudioRecord = null;}} }因?yàn)锳ndroid錄音完成保存的音頻格式默認(rèn)為 amr,這是個(gè)體積較小,播放效果較差的音頻格式,所以我們需要將 amr 格式的音頻轉(zhuǎn)成 mp3 格式。這個(gè)時(shí)候就需要使用我們剛剛編譯的so庫(kù)了。
步驟四:在錄音過程中實(shí)時(shí)轉(zhuǎn)成MP3格式
/*** 實(shí)現(xiàn)AudioRecord.OnRecordPositionUpdateListener* 從緩沖區(qū)中讀取并處理數(shù)據(jù),使用lame編碼MP3* @return 從緩沖區(qū)中讀取的數(shù)據(jù)的長(zhǎng)度,緩沖區(qū)中沒有數(shù)據(jù)時(shí)返回0*/ @Override public void onPeriodicNotification(AudioRecord recorder){if (mTasks.size() > 0) {Task task = mTasks.remove(0);short[] buffer = task.getData();int readSize = task.getReadSize();// 調(diào)用so庫(kù)轉(zhuǎn)成mp3int encodedSize = LameUtil.encode(buffer, buffer, readSize, mMp3Buffer);if (encodedSize > 0){try {mFileOutputStream.write(mMp3Buffer, 0, encodedSize);} catch (IOException e) {e.printStackTrace();}}return readSize;}return 0;} }步驟五:停止錄音
private void stopRecorder() {try {if (mRecorder != null) {mRecorder.stop();mRecorder = null;}} catch (Exception e) {e.printStackTrace();}}總結(jié)
以上是生活随笔為你收集整理的Android录音amr实时转成MP3格式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 华为称手机流畅度不由单一部件决定
- 下一篇: 第一周学习内容