日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android使用LAME Mp3编码

發布時間:2023/12/16 Android 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android使用LAME Mp3编码 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

下載地址:?LAME MP3 Encoder :: Site Map

當前最新版本是3.100源碼下載后以源碼方式直接引用。在工程中創建main/cpp文件夾,將源碼中的libmp3lame文件夾和include文件夾下的所有.h/.c文件拷貝至cpp目錄下。配置CmakeLists.txt文件。

在build.gradle中配置時需要添加CFLAG 編譯時參數 STDC_HEADERS,否則會在編譯期間報錯

/cpp/lame/psymodel.c:2164: undefined reference to `bcopy' CMakeFiles/lamer.dir/lame/quantize.c.o:/cpp/lame/quantize.c:1287: more undefined references to `bcopy' follow

因此額外添加:

externalNativeBuild {cmake {cFlags '-DSTDC_HEADERS'} }

?至此,LAME mp3編碼庫導入完成,可以開始編碼開發工作。

整體分為四個階段: 初始化,編碼,刷新緩存,銷毀。

1. 初始化

mLameClient = lame_init(); lame_set_in_samplerate(mLameClient, sample_rate); lame_set_out_samplerate(mLameClient, sample_rate); lame_set_num_channels(mLameClient, 1); lame_set_brate(mLameClient, 32); lame_set_quality(mLameClient, 7); lame_init_params(mLameClient);
  • in_samplerate: 輸入采樣率,默認44100HZ, 應該使用AudioRecord時設置的采樣率。
  • out_samplerate: 輸出采樣率,默認是0,LAME支持的輸出頻率有限包括:
* MPEG1 32, 44.1, 48khz * MPEG2 16, 22.05, 24 * MPEG2.5 8, 11.025, 12

MP3全稱是MPEG-1 audio layer3

MPEG-1音頻分為3層,分別是MPEG-1 Layer1/2/3,高層兼容低層,第三層協議被稱為MPEG-1 Layer3,簡稱MP3,2017年MP3專利過期已無專利保護任何人都可使用,已經成為主流的音頻壓縮技術。壓縮近10倍,適合網絡傳輸。

因此這里輸出頻率定義為44100HZ即可。

  • num_channels: 輸入流的聲道數,最多支持2個聲道,默認為2。根據AudioRecord采樣時的設置即可,
  • brate: 在CBR模式下有效。bitrate與compress ratio功能相同,僅設置一個就行,compression默認的壓縮率是11.025。
  • quality: 影響壓縮算法,值范圍為0-9, 0質量最好速度最慢,9質量最差速度最快。源碼建議:3 near-best quality, not too slow;?5 good quality, fast;?7 ok quality, really fast。根據場景選擇。
  • mode: 模式。立體聲或者單聲道。默認不設置和輸入聲道保持一致。
  • VBR:? 默認是CBR。VBR是動態碼率,適合于本地播放,根據編碼內容的復雜程度動態的分配比特,因此輸出質量比較高;CBR是靜態碼率,比特率在流處理過程中保持恒定一致,質量比變化比較明顯;vbr_off代表設置為cbr,vbr_mrth代表設置為vbr。其他參數可見代碼注釋。

2. 編碼

int lame_encode_buffer(lame_global_flags * gfp,const short int pcm_l[], const short int pcm_r[], const int nsamples,unsigned char *mp3buf, const int mp3buf_size)

pcm_l: 左聲道數據,short數組

pcm_r: 右聲道數據,short數組

nsmples: 數組長度,如果是單聲道,即對應的short數組的長度

mp3Buf: 編碼結果返回的數組,使用單字節長度容器裝載。

mp3buf_size: 編碼結果返回的數組長度,源碼中有建議給出

mp3buffer_size in bytes = 1.25*num_samples + 7200。

3.刷新緩存

在編碼結束之后,需要刷新編碼器的緩沖到mp3文件中。

int lame_encode_flush(lame_global_flags * gfp, unsigned char *mp3buffer, int mp3buffer_size)

?4.關閉

int lame_close(lame_global_flags * gfp)

以上即LAME編碼mp3的步驟。

我在項目中使用方式是邊錄邊編碼的方式,通過AudioRecord獲取到PCM數據,立刻通知編碼器進行編碼輸出到文件中。有兩個重要的點:

1. 如何通知給編碼器。 編碼和錄音運行在不同的線程中,如果編碼時機不對會造成遺漏數據的問題,因此采用阻塞隊列的方式,在錄音線程開始前即啟動編碼線程,在編碼線程中從阻塞隊列中讀取數據,如果沒有數據則阻塞等待,錄音線程獲取到數據后給隊列添加數據編碼線程開始處理。即保證了處理的及時性,也沒有耗費CPU資源。

2. 傳遞給LAME的PCM數據大小。有可能在錄音階段獲取的是byte數組,需要專為short數組,此時可以使用ByteBuffer轉換。在判斷是大端序還是小端序時,調用ByteBuffer#nativeOrder即可。

總結

以上是生活随笔為你收集整理的Android使用LAME Mp3编码的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。