真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Android音頻開(kāi)發(fā)(5):音頻數(shù)據(jù)的編解碼-創(chuàng)新互聯(lián)

前面四篇文章分別介紹了音頻開(kāi)發(fā)必備的基礎(chǔ)知識(shí)、如何采集一幀音頻、如何播放一幀音頻、如何存儲(chǔ)和解析wav格式的文件,建議有興趣的小伙伴們先讀一讀,本文則重點(diǎn)關(guān)注如何對(duì)一幀音頻數(shù)據(jù)進(jìn)行編碼和解碼。

專注于為中小企業(yè)提供網(wǎng)站設(shè)計(jì)制作、成都做網(wǎng)站服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)泗洪免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了成百上千家企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過(guò)網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。

1. Android 官方的 MediaCodec API

首先,我們了解一下 Android 官方提供的音頻編解碼的 API,即 MediaCodec 類,該 API 是在 Andorid 4.1 (API 16) 版本引入的,因此只能工作于 Android 4.1 以上的手機(jī)上。

1.1 MediaCodec 基本介紹

(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)一由 MediaCodec API 來(lái)提供各種音視頻編解碼功能,由參數(shù)配置來(lái)決定采用何種編解碼算法、是否采用硬件編解碼加速等等

1.2 MediaCodec 核心原理

我不準(zhǔn)備詳細(xì)介紹 MediaCodec API 的每個(gè)函數(shù)是怎么用,示例代碼大家可以在后面給出的資源鏈接中查看和學(xué)習(xí)。

這里我準(zhǔn)備重點(diǎn)介紹一下 MediaCodec 的核心工作原理,因?yàn)橹挥懈闱宄诉@一點(diǎn),你才會(huì)明白為什么 MediaCodec API 提供的接口是這個(gè)樣子的。

MediaCodec 使用的基本流程是:

- createEncoderByType/createDecoderByType
- configure
- start
- while(1) {
    - dequeueInputBuffer
    - queueInputBuffer
    - dequeueOutputBuffer
    - releaseOutputBuffer
}
- stop
- release

由此可以看到,Buffer 隊(duì)列的操作是其最核心的部分之一,關(guān)于 MediaCodec 的 Buffer 隊(duì)列 ,示意圖如下:

Android音頻開(kāi)發(fā)(5):音頻數(shù)據(jù)的編解碼

MediaCodec 架構(gòu)上采用了2個(gè)緩沖區(qū)隊(duì)列,異步處理數(shù)據(jù),下面描述的 Client 和 MediaCodec 模塊是并行工作的(注:這里的 Client 就是指 “開(kāi)發(fā)者,API 的使用者”):

(1)Client 從 input 緩沖區(qū)隊(duì)列申請(qǐng) empty buffer [dequeueInputBuffer]

(2)Client 把需要編解碼的數(shù)據(jù)拷貝到 empty buffer,然后放入 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ò)一段 Linux C 代碼,名叫:“rw_queue”,就是這種環(huán)形緩沖區(qū)的簡(jiǎn)化版,大家有興趣可以看看,地址:https://github.com/Jhuster/clib/tree/master/rw_queue

基于 idx 的環(huán)形緩沖區(qū)的總體示意圖如下,圖中,wp 代表 “寫指針”,指向的是 “empty buffer”, 而 rp 代表 “讀指針”,指向的是 “filled buffer”:

Android音頻開(kāi)發(fā)(5):音頻數(shù)據(jù)的編解碼

“生產(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)《Android MediaCodec stuff》

(3)《HWEncoderExperiments》

(4)一些開(kāi)源的播放器 Android 源碼,如 VLC、ijkplayer

2. 第三方音頻編解碼的庫(kù)

官方的 MediaCodec API 雖然支持硬件編解碼加速,但是問(wèn)題和局限還是很多的,一方面是只能在 Android 4.1 以上機(jī)型上才能使用,另一方面,由于 Android 手機(jī)種類繁多,廠商對(duì)底層源碼的修改各不相同,導(dǎo)致 MediaCodec API 在實(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ì)明顯的 HE AAC,我曾經(jīng)用它實(shí)現(xiàn)了一款 Android 局域網(wǎng)的VoIP網(wǎng)絡(luò)電話應(yīng)用:“飛鴿電話”,效果很不錯(cuò)。

opus 官網(wǎng)地址:https://www.opus-codec.org

注:如今 Android 5.0 已經(jīng)官方支持 opus 格式了,關(guān)于 Android 支持的多媒體格式列表可以查看 Android developer guide:《Supported Media Formats》

(2) Speex 編解碼庫(kù)

老牌的音頻處理庫(kù),不僅是編解碼,還提供了包括音頻去噪、回聲消除、靜音檢測(cè)等功能,官網(wǎng)地址:http://www.speex.org

(3) ffmpeg

大名鼎鼎的 ffmpeg 肯定不能錯(cuò)過(guò),官網(wǎng):https://www.ffmpeg.org

(4)Android AAC Encoder

一款輕量級(jí)的 Android aac 編碼庫(kù):https://github.com/timsu/android-aac-enc

(5)opencore-amr-android

從 opencore 抽取出來(lái)的 amr 編解碼庫(kù),地址:https://github.com/kevinho/opencore-amr-android

(6)iLBC-Android

iLBC 是著名的 WebRTC 項(xiàng)目的音頻編解碼模塊,iLBC-Android 是從中抽取 iLBC 模塊移植到 Android 平臺(tái)的個(gè)人項(xiàng)目,地址:https://github.com/lukeweber/iLBC-Android

關(guān)于第三方編解碼庫(kù)就簡(jiǎn)單介紹到這里了,最后三個(gè)是個(gè)人項(xiàng)目,我沒(méi)有使用過(guò),真心感謝這些作者的無(wú)私奉獻(xiàn),另外,更多的第三方庫(kù)歡迎大家留言或者來(lái)信補(bǔ)充。

3. 小結(jié)

關(guān)于如何在 Android 平臺(tái)編解碼音頻數(shù)據(jù)就簡(jiǎn)單介紹到這里了,文章中有不清楚的地方歡迎留言或者來(lái)信 lujun.hust@gmail.com 交流,或者關(guān)注我的新浪微博 @盧_俊 或者 微信公眾號(hào) @Jhuster 獲取最新的文章和資訊。

Android音頻開(kāi)發(fā)(5):音頻數(shù)據(jù)的編解碼

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。


文章題目:Android音頻開(kāi)發(fā)(5):音頻數(shù)據(jù)的編解碼-創(chuàng)新互聯(lián)
分享鏈接:http://weahome.cn/article/dihcjp.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部