下載本文檔
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
【移動(dòng)應(yīng)用開(kāi)發(fā)技術(shù)】Android音頻開(kāi)發(fā)(5):音頻數(shù)據(jù)的編解碼
前面四篇文章分別介紹了音頻開(kāi)發(fā)必備的基礎(chǔ)知識(shí)、如何采集一幀音頻、如何播放一幀音頻、如何存儲(chǔ)和解析wav格式的文件,建議有興趣的小伙伴們先讀一讀,本文則重點(diǎn)關(guān)注如何對(duì)一幀音頻數(shù)據(jù)進(jìn)行編碼和解碼。1.Android官方的MediaCodecAPI首先,我們了解一下Android官方提供的音頻編解碼的API,即MediaCodec類,該API是在Andorid4.1(API16)版本引入的,因此只能工作于Android4.1以上的手機(jī)上。1.1MediaCodec基本介紹(1)提供了一套訪問(wèn)Android底層多媒體模塊的接口,主要是音視頻的編解碼接口(2)Android底層多媒體模塊采用的是OpenMax框架,任何Android底層編解碼模塊的實(shí)現(xiàn),都必須遵循OpenMax標(biāo)準(zhǔn)。Google官方默認(rèn)提供了一系列的軟件編×××:包括:OMX.google.h364.encoder,OMX.google.h364.encoder,OMX.google.aac.encoder,OMX.google.aac.decoder等等,而硬件編解碼功能,則需要由芯片廠商依照OpenMax框架標(biāo)準(zhǔn)來(lái)完成,所以,一般采用不同芯片型號(hào)的手機(jī),硬件編解碼的實(shí)現(xiàn)和性能是不同的(3)Android應(yīng)用層統(tǒng)一由MediaCodecAPI來(lái)提供各種音視頻編解碼功能,由參數(shù)配置來(lái)決定采用何種編解碼算法、是否采用硬件編解碼加速等等1.2MediaCodec核心原理我不準(zhǔn)備詳細(xì)介紹MediaCodecAPI的每個(gè)函數(shù)是怎么用,示例代碼大家可以在后面給出的資源鏈接中查看和學(xué)習(xí)。這里我準(zhǔn)備重點(diǎn)介紹一下MediaCodec的核心工作原理,因?yàn)橹挥懈闱宄诉@一點(diǎn),你才會(huì)明白為什么MediaCodecAPI提供的接口是這個(gè)樣子的。MediaCodec使用的基本流程是:-
createEncoderByType/createDecoderByType
-
configure
-
start
-
while(1)
{
-
dequeueInputBuffer
-
queueInputBuffer
-
dequeueOutputBuffer
-
releaseOutputBuffer
}
-
stop
-
release由此可以看到,Buffer隊(duì)列的操作是其最核心的部分之一,關(guān)于MediaCodec的Buffer隊(duì)列,示意圖如下:MediaCodec架構(gòu)上采用了2個(gè)緩沖區(qū)隊(duì)列,異步處理數(shù)據(jù),下面描述的Client和MediaCodec模塊是并行工作的(注:這里的Client就是指“開(kāi)發(fā)者,API的使用者”):(1)Client從input緩沖區(qū)隊(duì)列申請(qǐng)emptybuffer[dequeueInputBuffer](2)Client把需要編解碼的數(shù)據(jù)拷貝到emptybuffer,然后放入
input
緩沖區(qū)隊(duì)列[queueInputBuffer]
(3)MediaCodec模塊從input
緩沖區(qū)隊(duì)列取一幀數(shù)據(jù)進(jìn)行編解碼處理(4)編解碼處理結(jié)束后,MediaCodec將原始數(shù)據(jù)buffer置為empty后放回input緩沖區(qū)隊(duì)列,將編解碼后的數(shù)據(jù)放入到output緩沖區(qū)隊(duì)列(5)Client從output緩沖區(qū)隊(duì)列申請(qǐng)編解碼后的buffer
[dequeueOutputBuffer](6)Client對(duì)編解碼后的buffer進(jìn)行渲染/播放(7)渲染/播放完成后,Client再將該buffer放回output緩沖區(qū)隊(duì)列[releaseOutputBuffer]MediaCodec在架構(gòu)上,其實(shí)是采用了一種基于“環(huán)形緩沖區(qū)”的“生產(chǎn)者-消費(fèi)者”模式,它設(shè)計(jì)了2個(gè)基于idx序號(hào)的“環(huán)形緩沖區(qū)”,注意,是2個(gè),一個(gè)在input端,一個(gè)在output端。我曾經(jīng)在Github上分享過(guò)一段LinuxC代碼,名叫:“rw_queue”,就是這種環(huán)形緩沖區(qū)的簡(jiǎn)化版,大家有興趣可以看看,地址:/Jhuster/clib/tree/master/rw_queue基于idx的環(huán)形緩沖區(qū)的總體示意圖如下,圖中,wp代表“寫指針”,指向的是“emptybuffer”,而rp代表“讀指針”,指向的是“filledbuffer”:“生產(chǎn)者”和“消費(fèi)者”其實(shí)是共用這一個(gè)緩沖區(qū)隊(duì)列,“生產(chǎn)者”負(fù)責(zé)從隊(duì)列中取出未使用的Buffer,填入數(shù)據(jù),然后放回隊(duì)列,“消費(fèi)者”則負(fù)責(zé)取出填入數(shù)據(jù)后的Buffer,進(jìn)行處理,處理結(jié)束后,再把Buffer標(biāo)記為“空”,退回到隊(duì)列中去以供“生產(chǎn)者”繼續(xù)填充數(shù)據(jù)。在input端,“Client”是這個(gè)環(huán)形緩沖區(qū)“生產(chǎn)者”,“MediaoCodec模塊”是“消費(fèi)者”。在output端,“MediaoCodec模塊”是這個(gè)環(huán)形緩沖區(qū)“生產(chǎn)者”,而“Client”則變成了“消費(fèi)者”。這就是其核心的工作原理,其實(shí)并不復(fù)雜,大家靜下心來(lái),很快就能理解其中的奧妙。1.3
參考資源關(guān)于MediaCodec的示例代碼,網(wǎng)上其實(shí)也很多了,我就直接給出一些個(gè)人覺(jué)得不錯(cuò)的鏈接,有興趣的小伙伴們可以去研究一下。(1)Android官方文檔:《MediaCodec》(2)《AndroidMediaCodecstuff》(3)《HWEncoderExperiments》(4)一些開(kāi)源的播放器Android源碼,如VLC、ijkplayer2.第三方音頻編解碼的庫(kù)官方的MediaCodecAPI雖然支持硬件編解碼加速,但是問(wèn)題和局限還是很多的,一方面是只能在Android4.1以上機(jī)型上才能使用,另一方面,由于Android手機(jī)種類繁多,廠商對(duì)底層源碼的修改各不相同,導(dǎo)致MediaCodecAPI在實(shí)際使用中,會(huì)遇到很多坑,有很多兼容性的問(wèn)題,因此,我們也可以考慮采用第三方的編解碼庫(kù)。這里,我簡(jiǎn)單推薦幾款第三方音頻編解碼庫(kù)(可以移植到Android平臺(tái)的),大家可以直接去官網(wǎng)或者項(xiàng)目主頁(yè)了解其詳細(xì)信息。(1)opus編解碼庫(kù)很喜歡opus,低碼率下opus完勝曾經(jīng)優(yōu)勢(shì)明顯的HEAAC,我曾經(jīng)用它實(shí)現(xiàn)了一款A(yù)ndroid局域網(wǎng)的VoIP網(wǎng)絡(luò)電話應(yīng)用:“飛鴿電話”,效果很不錯(cuò)。opus官網(wǎng)地址:注:如今Android5.0已經(jīng)官方支持opus格式了,關(guān)于Android支持的多媒體格式列表可以查看Androiddeveloperguide:《SupportedMediaFormats》(2)Speex編解碼庫(kù)老牌的音頻處理庫(kù),不僅是編解碼,還提供了包括音頻去噪、回聲消除、靜音檢測(cè)等功能,官網(wǎng)地址:(3)ffmpeg大名鼎鼎的ffmpeg肯定不能錯(cuò)過(guò),官網(wǎng):(4)AndroidAACEncoder一款輕量級(jí)的Androidaac編碼庫(kù):/timsu/android-aac-enc(5)opencore-amr-android從opencore抽取出來(lái)的amr編解碼庫(kù),地址:/kevinho/opencore-amr-android(6)iLBC-AndroidiLBC是著名的WebRTC項(xiàng)目的音頻編解碼模塊,iLBC-Android是從中抽取iLBC模塊移植到Android平臺(tái)的個(gè)人項(xiàng)目,地址:/lukeweber/iLBC-Android關(guān)于第三方編解碼庫(kù)就簡(jiǎn)單介紹到這里了,
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 山嶺土地開(kāi)發(fā)合同范本
- 規(guī)范崗位名稱管理制度
- 生鮮配送考勤制度規(guī)范
- 爐灶氣閥安全制度規(guī)范
- 煎藥室工作制度及規(guī)范
- 規(guī)范辦公用品管理制度
- 石油單位聯(lián)油制度規(guī)范
- 旅游碼頭制度規(guī)范標(biāo)準(zhǔn)
- 男性家族工作制度規(guī)范
- 消防熄燈制度規(guī)范標(biāo)準(zhǔn)
- 2026北京大興初二上學(xué)期期末語(yǔ)文試卷和答案
- 2025年武漢大學(xué)專職管理人員和學(xué)生輔導(dǎo)員招聘真題
- 盧氏縣橫澗壯溝鐵礦礦山地質(zhì)環(huán)境保護(hù)與土地復(fù)墾方案
- 醫(yī)護(hù)人員形象禮儀培訓(xùn)
- 中國(guó)的“愛(ài)經(jīng)”(一)-《天地陰陽(yáng)交⊥歡大樂(lè)賦》
- 心房鈉尿肽基因敲除小鼠的繁殖和鑒定
- 母嬰護(hù)理職業(yè)道德課件
- 口腔頜面外科學(xué)(全)
- 安徽金軒科技有限公司 年產(chǎn)60萬(wàn)噸硫磺制酸項(xiàng)目環(huán)境影響報(bào)告書
- 魔鬼理論之k線秘笈圖解課件
- GB/T 9163-2001關(guān)節(jié)軸承向心關(guān)節(jié)軸承
評(píng)論
0/150
提交評(píng)論