❶ 怎樣用AACLib V1.0在android上音頻編碼解碼
這幾天在 android上的音頻項目,順便把用到的aac編解碼庫封裝了一下,有需要的可以從上面下載。當然我是沒有本事自己寫編解碼器的,還是用FFmpeg + FDK_aac來做。下面介紹一下其java介面的使用。java庫見libaac.jar文件,把libaac.jar加到 libs目錄下,把libaac.so加到 libs/armeabi目錄即可使用。
AAC編碼:
(1) 創建一個Encoder對象作為成員變數
aac.Encoder encoder;
(2) 初始化它
encoder = new aac.Encoder();
if(! encoder.open(11025, 1))
{
Log.d("mylog", "failed to open encoder !\n");
encoder = null;
}
這里要指定輸入音頻源(PCM格式)的sampe_rate和channel個數,如果為CHANNEL_OUT_MONO,則channel=1,否則為2。 sample_rate一般設置為11025,因為手機性能有限,設置太高的話也處理不過來,而且處理人聲的話11025也是足夠了。
(3) 編碼
把接收到PCM數據交給encoder來處理即可,要求輸入源為ENCODING_PCM_16BIT,即每個sample是16BIT的。這個encoder對象內有2個緩沖區:inbuf, outbuf。顯然,在編碼時,inbuf就是用於存儲接收到的PCM數據,outbuf就是存編碼後得到的數據。
int out_size = encoder.encode(in_size);
其返回值out_size,表示在outbuf里的有效數據長度。此時可以把outbuf里的aac數據通過網路發送或其他用途。
其中,用戶需要知道encoder每次處理多長的數據,即一個frame的大小。對於單聲道MONO來說,每次應該輸入2048byte的數據。對於雙聲道STEREO來說,應該輸入4096byte的數據。下面這一行可以根據聲道數來計算輸入的frame的大小:
int in_size = aac.Encoder.frameSize(1);
AAC解碼:
(1) 創建一個Decoder對象作為成員變數
aac.Decoder decoder;
(2) 初始化
decoder = new aac.Decoder();
if( ! decoder.open())
{
Log.d("mylog", "failed to open decoder !\n");
decoder = null;
}
(3) 解碼
Decoder對象也有inbuf和outbuf,把待解碼的aac frame放到inbuf里
int pcm_size = decoder.decode(aac_size);
解得到數據在outbuf里,其有效長度為上述函數的返回值pcm_size,此時可以把outbuf里的PCM數據取出來播放或其他用途。
❷ 音頻播放需要用到編解碼技術嗎 android
1、android提供的音視頻編碼只有 AMR-NB(nb是窄頻)和H.263
2、android雖然支持gif的解碼,只能用mediaplay來播放,但是效果不好
3、android不支持flv的解碼
4、AudioTrack只能播放pcm編碼的數據,MediaPlayer可以播放MP3,AAC,WAV,OGG,MIDI等
事實上,兩種本質上是沒啥區別的,MediaPlayer在播放音頻時,在framework層還是會創建AudioTrack,
把解碼後的PCM數據傳遞給AudioTrack,最後由AudioFlinger進行混音,傳遞音頻給硬體播放出來。
利用AudioTrack播放只是跳過 Mediaplayer的解碼部分而已。Mediaplayer的解碼核心部分是基於OpenCORE 來實現的,
支持通用的音視頻和圖像格式,codec使用的是OpenMAX介面來進行擴展。因此使用audiotrack播放mp3文件的話,要自己加入 一個音頻解碼器,如libmad。
否則只能播放PCM數據,如大多數WAV格式的音頻文件。
❸ 【Android 音視頻開發-FFmpeg音視頻編解碼篇】1.FFmpeg so庫編譯
本文提供Android平台FFmpeg so庫的編譯指南,從交叉編譯概念到實踐操作,深入淺出地解析了FFmpeg的編譯流程。首先,交叉編譯定義為在一台機器上生成另一台平台的可執行代碼,對於Android應用開發至關重要。接著,文章解釋了為何需要交叉編譯,強調資源限制與利用PC資源的優勢。
為實現這一目標,文章推薦使用GCC或CLANG工具鏈進行編譯,並說明了這兩個工具的不同點,其中CLANG因其效率優勢被Google推薦使用,且在NDK 17版本後取代了GCC。
文章進一步介紹了如何使用CLANG進行FFmpeg編譯,包括選擇合適的Android版本和CPU架構,配置編譯工具路徑,並下載FFmpeg源碼。特別提及了配置腳本configure的修改,以適應Android平台,以及如何避免常見的編譯失敗原因。
文章詳細分析了configure配置腳本的邏輯,解釋了cross_prefix_clang、--target-os=android、--sysroot=$SYSROOT等關鍵選項的作用,並探討了cc和cross_prefix的配置差異,為解決編譯過程中的困惑提供了清晰的解釋。
在配置GCC編譯FFmpeg時,文章指出由於NDK r17c後移除了GCC,推薦使用較舊版本的NDK r17b。文章展示了如何根據編譯平台選擇對應的NDK版本,以及構建GCC編譯環境。
文章最後總結了編譯FFmpeg的基本步驟,並鼓勵讀者通過更多選項實現FFmpeg的定製化編譯,以適應不同需求。通過本文,開發者將能更加深入地理解FFmpeg編譯過程,輕松實現Android平台的音視頻編解碼庫構建。