Android音訊開發(5) 音訊資料的編譯碼

2021-09-03 10:34:31 字數 2966 閱讀 3645

1. android 官方的 mediacodec api

首先,我們了解一下 android 官方提供的音訊編譯碼的 api,即 mediacodec 類,該 api 是在 andorid 4.1 (api 16) 版本引入的,因此只能工作於 android 4.1 以上的手機上。

1.1 mediacodec 基本介紹

(2)android 底層多**模組採用的是 openmax 框架,任何 android 底層編譯碼模組的實現,都必須遵循 openmax 標準。google 官方預設提供了一系列的軟體編解碼器:包括:omx.google.h264.encoder,omx.google.h264.encoder, omx.google.aac.encoder, omx.google.aac.decoder 等等,而硬體編譯碼功能,則需要由晶元廠商依照 openmax 框架標準來完成,所以,一般採用不同晶元型號的手機,硬體編譯碼的實現和效能是不同的

1.2 mediacodec 核心原理

這裡我準備重點介紹一下 mediacodec 的核心工作原理,因為只有搞清楚了這一點,你才會明白為什麼 mediacodec api 提供的介面是這個樣子的。

mediacodec 使用的基本流程是:

- createencoderbytype/createdecoderbytype

- configure

- start

- while(1) 

- stop

- release

由此可以看到,buffer 佇列的操作是其最核心的部分之一,關於 mediacodec 的 buffer 佇列 ,示意圖如下:

mediacodec 架構上採用了2個緩衝區佇列,非同步處理資料,下面描述的 client 和 mediacodec 模組是並行工作的(注:這裡的 client 就是指 「開發者,api 的使用者」):

(1)client 從 input 緩衝區佇列申請 empty buffer [dequeueinputbuffer]

(2)client 把需要編譯碼的資料拷貝到 empty buffer,然後放入 input 緩衝區佇列 [queueinputbuffer] 

(3)mediacodec 模組從 input 緩衝區佇列取一幀資料進行編譯碼處理

(4)編譯碼處理結束後,mediacodec 將原始資料 buffer 置為 empty 後放回 input 緩衝區佇列,將編譯碼後的資料放入到 output 緩衝區佇列

(5)client 從 output 緩衝區佇列申請編譯碼後的 buffer [dequeueoutputbuffer]

mediacodec 在架構上,其實是採用了一種基於「環形緩衝區」的「生產者-消費者」模式,它設計了 2 個基於 idx 序號的「環形緩衝區」,注意,是 2 個,乙個在 input 端, 乙個在 output 端。

基於 idx 的環形緩衝區的總體示意圖如下,圖中,wp 代表 「寫指標」,指向的是 「empty buffer」, 而 rp 代表 「讀指標」,指向的是 「filled buffer」:

「生產者」和「消費者」其實是共用這乙個緩衝區佇列,「生產者」負責從佇列中取出未使用的 buffer,填入資料,然後放回佇列,「消費者」則負責取出填入資料後的 buffer,進行處理,處理結束後,再把 buffer 標記為「空」,退回到佇列中去以供「生產者」繼續填充資料。

在 input 端,「client」是這個環形緩衝區「生產者」,「mediaocodec 模組」是「消費者」。

在 output 端,「mediaocodec 模組」是這個環形緩衝區「生產者」,而「client」則變成了「消費者」。

這就是其核心的工作原理,其實並不複雜,大家靜下心來,很快就能理解其中的奧妙。

1.3  參考資源

關於 mediacodec 的示例**,網上其實也很多了,我就直接給出一些個人覺得不錯的鏈結,有興趣的小夥伴們可以去研究一下。

(1)android 官方文件: 《mediacodec》

(2)《android mediacodec stuff》

(3)《hwencoderexperiments》

2. 第三方音訊編譯碼的庫

官方的 mediacodec api 雖然支援硬體編譯碼加速,但是問題和侷限還是很多的,一方面是只能在 android 4.1 以上機型上才能使用,另一方面,由於 android 手機種類繁多,廠商對底層原始碼的修改各不相同,導致 mediacodec api 在實際使用中,會遇到很多坑,有很多相容性的問題,因此,我們也可以考慮採用第三方的編譯碼庫。

(1) opus 編譯碼庫

很喜歡 opus,低位元速率下 opus 完勝曾經優勢明顯的 he aac,我曾經用它實現了一款 android 區域網的voip網路**應用:「飛鴿**」,效果很不錯。

(2) speex 編譯碼庫

(3) ffmpeg

大名鼎鼎的 ffmpeg 肯定不能錯過,官網:

(4)android aac encoder

一款輕量級的 android aac 編碼庫:

(5)opencore-amr-android

(6)ilbc-android

3. 小結

Android音訊開發(5) 音訊資料的編譯碼

1.android 官方的 mediacodec api 首先,我們了解一下 android 官方提供的音訊編譯碼的 api,即 mediacodec 類,該 api 是在 andorid 4.1 api 16 版本引入的,因此只能工作於 android 4.1 以上的手機上。樂搏學院 1.1 me...

Android獲取手機內的音訊資料

這個叫做mediaprovider.apk是幹什麼的呢,和我們今天講的東西有啥關聯嗎,其實這是乙個正在執行的apk,這個apk是沒有介面的,因此我們是看不見的,他的作用就是在後台默默的為我們收集相關的資料資訊。然後儲存在資料庫裡面 從上面的截圖上看,這個apk把我們收集內的 資訊都儲存在資料庫中了,...

Android 音訊採集(原始音訊)

android 音訊簡介 常見的音訊編譯碼的型別 aac opus amr ogg pcm aac 高階音訊編碼 對應 m4a audio m4a 或者.3pg audio 3gpp 檔案 heaac 高階aac,使用的比較多。opus 有損聲音編碼的格式,由網際網路工程任務組 ietf 進來開發,...