两个人的电影免费视频_国产精品久久久久久久久成人_97视频在线观看播放_久久这里只有精品777_亚洲熟女少妇二三区_4438x8成人网亚洲av_内谢国产内射夫妻免费视频_人妻精品久久久久中国字幕

一種適配androidstagefright多媒體框架的音頻解碼系統(tǒng)及方法

文檔序號(hào):7862852閱讀:375來源:國(guó)知局
專利名稱:一種適配android stagefright 多媒體框架的音頻解碼系統(tǒng)及方法
技術(shù)領(lǐng)域
本發(fā)明涉及多媒體信息處理技術(shù)領(lǐng)域,具體是涉及一種適配androidstagefright多媒體框架的音頻解碼系統(tǒng)及方法。
背景技術(shù)
移動(dòng)手機(jī)操作系統(tǒng)的誕生引發(fā)了手機(jī)等移動(dòng)終端的智能化。其中較有代表性的是Apple的iOS和Google的android。android在近幾年內(nèi)得到了迅速發(fā)展,android的多媒體框架最初采用的是openCore架構(gòu),由于其大而復(fù)雜,到android 2. 3,多媒體框架完全采用了 stagefright。android軟件棧從底至頂分為四層linux內(nèi)核、本地庫及android運(yùn)行庫、java框架、核心應(yīng)用。stagefright多媒體框架位于第二層,是一個(gè)本地 庫。stagefright將多媒體音視頻的包裝格式解析、編解碼和顯示進(jìn)行封裝,提供對(duì)整個(gè)多媒體信息處理的支持。如圖I為stagefright與Iinux驅(qū)動(dòng)、多媒體服務(wù)和解碼插件間的關(guān)系。android 底層名為“mediaserver”的 Iinux 進(jìn)程通過訪問 MediaPlayerService 調(diào)用stagefright多媒體框架完成音視頻的包裝格式解析、解碼和播放等。stagefright主要包括了 AwesomePlayer> MediaExtractor、OMXCodec> AwesomeRenderer 和 AudioPlayer等。其中AwesomePlayer作為所有其他對(duì)象的組合,可依次通過DataSource獲取多媒體數(shù)據(jù)源、再通過MediaExtractor解包裝組件完成文件格式(如.mp3)解析并提取音視頻流、進(jìn)而通過OMXCodec調(diào)用解碼插件完成音視頻流的解碼、最后通過AwesomeRenderer和AudioPlayer將最終數(shù)據(jù)送往音視頻I/O設(shè)備,完成播放顯示。android 2. 3作為目前市場(chǎng)滲透率最深的android版本,以其子版本android2. 3. 4的音頻軟解碼器為例,僅支持MP3、AMR、AAC、G711和Vorbis音頻格式,不支持AC3、PCM、RealVideo Cooker、MP2、WMA和FLAC等音頻編碼。這種局限性不僅使得有些音頻文件無法在android系統(tǒng)上播放,也使得包含某些音頻流的視頻文件無法在android系統(tǒng)上播放。android軟件棧具備很好的設(shè)計(jì)模式,可采用實(shí)現(xiàn)MediaSource抽象類通用接口的形式,設(shè)計(jì)一個(gè)適配stagefright框架的新插件,通過新插件達(dá)到擴(kuò)充stagefright多媒體框架音頻解碼功能的目的。

發(fā)明內(nèi)容
本發(fā)明所要解決的技術(shù)問題是,提供一種適配android stagefright多媒體框架的音頻解碼方法及系統(tǒng),以擴(kuò)大該多媒體框架對(duì)音頻編碼格式的支持。本發(fā)明的技術(shù)問題通過以下技術(shù)手段予以解決
一種適配android stagefright多媒體框架的音頻解碼方法,包括以下步驟
音頻解碼系統(tǒng)構(gòu)造步驟保存AwesomePlayer輸入的解包裝組件,完成音頻解碼器的注冊(cè);通過所述解包裝組件獲取音頻的媒體元數(shù)據(jù)并保存至本地;
開始步驟從本地的媒體元數(shù)據(jù)中獲取上下文環(huán)境數(shù)據(jù)項(xiàng),申請(qǐng)內(nèi)存資源作為解碼輸出緩沖;以及根據(jù)所述上下文環(huán)境,打開并初始化所述音頻解碼器中與所述音頻流格式相匹配的解碼器,申請(qǐng)內(nèi)存資源作為解碼輸入緩沖;
讀取步驟通過所述解包裝組件讀取音頻編碼數(shù)據(jù)至所述輸入緩沖,進(jìn)行音頻解碼;更新所述本地的媒體元數(shù)據(jù)中的采樣率數(shù)據(jù)為所述音頻編碼數(shù)據(jù)的采樣率;根據(jù)本地的媒體元數(shù)據(jù)計(jì)算得到解碼輸出數(shù)據(jù)的時(shí)間戳并保持至所述輸出緩沖,從所述輸出緩沖返回?cái)y帶時(shí)間戳的原始音頻數(shù)據(jù);
停止步驟釋放所述開始接口模塊申請(qǐng)作為解碼輸出緩沖和解碼輸入緩沖的內(nèi)存資源。優(yōu)選地
述音頻解碼系統(tǒng)構(gòu)造步驟包括
1-1)保存AwesomePlayer輸入的解包裝組件,通過ffmpeg工具箱完成其支持格式的音頻解碼器的注冊(cè);1_2)通過所述解包裝組件獲取音頻的媒體元數(shù)據(jù);1_3)在步驟1-2)得到的媒體元數(shù)據(jù)中搜索音頻聲道數(shù)、采樣率、和持續(xù)時(shí)間信息;1_4)將步驟1-3)得到的音頻聲道數(shù)、采樣率、和持續(xù)時(shí)間信息復(fù)制保存至本地的媒體元數(shù)據(jù)中。所述開始步驟包括
2-1)獲取所述本地的媒體元數(shù)據(jù)的地址;2_2)從所述本地的媒體元數(shù)據(jù)中獲取上下文環(huán)境數(shù)據(jù)項(xiàng);2_3)從所述本地的媒體元數(shù)據(jù)中獲取音頻流在多媒體源中的編號(hào),通過該編號(hào)判斷從多媒體源中獲取的流是否為音頻流,若是,則進(jìn)行解碼,否則跳過;2_4)申請(qǐng)一個(gè)容量大于音頻解碼最大輸出字節(jié)數(shù)的內(nèi)存資源作為輸出緩沖;2-5)通過ffmpeg工具箱找到并打開與所述上下文環(huán)境數(shù)據(jù)項(xiàng)中的解碼格式ID相匹配的解碼器;2-6)申請(qǐng)一個(gè)容量大于AUDI0_REFILL_THRESH*2的內(nèi)存資源作為輸入緩沖,并將輸入緩沖中帶解碼數(shù)據(jù)的字節(jié)數(shù)和地址偏移量均初始化為0,其中,AUDIO_REFILL_THRESH為開始音頻解碼時(shí)所需數(shù)據(jù)量閾值。 所述讀取步驟包括
3-1)獲取輸出緩沖作為后續(xù)所有步驟的解碼輸出緩沖;3_2)設(shè)置音頻解碼所需最少字節(jié)數(shù)為AUDIO_REFILL_THRESH,以避面因數(shù)據(jù)不足而導(dǎo)致解碼失??;3_3)判斷所述輸入緩沖中待解碼數(shù)據(jù)字節(jié)數(shù)是否小于閾值A(chǔ)UDIO_REFILL_THRESH,若是,則滑動(dòng)輸入緩沖中待解碼數(shù)據(jù),使得其地址偏移量恢復(fù)為O ;若不是,跳過該步驟;3-4)如果所述輸入緩沖中待解碼數(shù)據(jù)小于AUDIO_REFILL_THRESH,則通過解包裝組件從多媒體源中讀取音頻流數(shù)據(jù),并將這些新數(shù)據(jù)添加到輸入緩沖中待解碼數(shù)據(jù)的尾部,接著累加待解碼數(shù)據(jù)字節(jié)數(shù)、保存當(dāng)前音頻包的時(shí)間戳等;如果待解碼數(shù)據(jù)的字節(jié)數(shù)仍小于AUDIO_REFILL_THRESH,則繼續(xù)步驟3-4),否則進(jìn)入步驟3-5) ;3-5)通過ffmpeg工具箱對(duì)輸入緩沖中待解碼數(shù)據(jù)進(jìn)行解碼,解碼輸出數(shù)據(jù)存儲(chǔ)在步驟3-1)獲取的輸出緩沖中,記解碼輸出字節(jié)數(shù)為output_frame_size, ffmpeg工具箱從輸入緩沖中消耗的字節(jié)數(shù)為byte_used ;3_6)將輸入緩沖待解碼數(shù)據(jù)的地址偏移量加byte_used而字節(jié)數(shù)減byte_used ;3_7)若output_frame_size小于或等于0,則回到步驟3-3),否則進(jìn)入步驟3-8);3-8)將輸出緩沖的地址偏移量和字節(jié)總數(shù)分別設(shè)置為O和output_frame_size ;3_9)根據(jù)步驟3_4)得到的音頻包時(shí)間戳、媒體元數(shù)據(jù)的采樣率和聲道數(shù),以及解碼累計(jì)輸出總采樣點(diǎn)數(shù)等計(jì)算得到解碼輸出數(shù)據(jù)的時(shí)間戳;3-10)將攜帶時(shí)間戳信息的解碼輸出緩沖返回。一種適配android stagefright多媒體框架的音頻解碼系統(tǒng),包括
音頻解碼系統(tǒng)構(gòu)造模塊,用于保存AwesomePlayer輸入的解包裝組件,完成音頻解碼器的注冊(cè);通過所述解包裝組件獲取音頻的媒體元數(shù)據(jù)并保存至本地;
開始接口模塊,用于從本地的媒體元數(shù)據(jù)中獲取上下文環(huán)境數(shù)據(jù)項(xiàng),申請(qǐng)內(nèi)存資源作為解碼輸出緩沖;以及根據(jù)所述上下文環(huán)境,打開并初始化所述音頻解碼器中與所述音頻流格式相匹配的解碼器,申請(qǐng)內(nèi)存資源作為解碼輸入緩沖;
讀取接口模塊,用于通過所述解包裝組件讀取音頻編碼數(shù)據(jù)至所述輸入緩沖,進(jìn)行音頻解碼;更新所述本地的媒體元數(shù)據(jù)中的采樣率數(shù)據(jù)為 所述音頻編碼數(shù)據(jù)的采樣率;根據(jù)本地的媒體元數(shù)據(jù)計(jì)算得到解碼輸出數(shù)據(jù)的時(shí)間戳并保持至所述輸出緩沖,從所述輸出緩沖返回?cái)y帶時(shí)間戳的原始音頻數(shù)據(jù);
停止接口模塊,用于釋放所述開始接口模塊申請(qǐng)作為解碼輸出緩沖和解碼輸入緩沖的內(nèi)存資源。與現(xiàn)有技術(shù)相比,本發(fā)明音頻解碼系統(tǒng)和方法不但能夠支持Andriod原來支持的MP3、AMR等音頻格式的解碼外,通過新的解碼器擴(kuò)展支持更多格式的音頻的解碼,例如AC3、PCM、RealVideo Cooker、MP2、WMA和FLAC等格式的音頻,本發(fā)明的音頻解碼系統(tǒng)具有音頻解碼復(fù)雜度第,具有優(yōu)良的移植性。優(yōu)選方案中采用的輸入緩沖控制方式不但能夠避免緩沖溢出,同時(shí)也避免了大量數(shù)據(jù)的頻繁拷貝。


圖I為android stagefright框架與android其他模塊的關(guān)系 圖2為本發(fā)明具體實(shí)施例解碼過程中輸入緩沖一個(gè)典型的狀態(tài)變化過程;
圖3為本發(fā)明具體實(shí)施例解碼過程中輸入緩沖正常工作時(shí)的狀態(tài)轉(zhuǎn)移 圖4為本發(fā)明具體實(shí)施例音頻解碼方法構(gòu)造過程的流程 圖5為本發(fā)明具體實(shí)施例音頻解碼方法中開始步驟的流程 圖6為本發(fā)明具體實(shí)施例音頻解碼方法緩沖的組織形式原理 圖7為本發(fā)明具體實(shí)施例音頻解碼方法中讀取步驟的流程圖。
具體實(shí)施例方式下面對(duì)照附圖并結(jié)合優(yōu)選的實(shí)施方式對(duì)本發(fā)明作進(jìn)一步說明。本實(shí)施例的一種適配android stagefright多媒體框架的音頻解碼方法,主要包括解碼系統(tǒng)構(gòu)造步驟、開始步驟、讀取步驟、停止步驟,分別有本實(shí)施例的一種適配androidstagefright多媒體框架的音頻解碼系統(tǒng)的解碼系統(tǒng)構(gòu)造模塊、開始接口模塊、讀取接口模塊和停止接口模塊完成。其中,音頻解碼系統(tǒng)構(gòu)造步驟包括保存AwesomePlayer輸入的解包裝組件,完成音頻解碼器的注冊(cè);通過所述解包裝組件獲取音頻的媒體元數(shù)據(jù)并保存至本地;開始步驟包括從本地的媒體元數(shù)據(jù)中獲取上下文環(huán)境數(shù)據(jù)項(xiàng),申請(qǐng)內(nèi)存資源作為解碼輸出緩沖;以及根據(jù)所述上下文環(huán)境,打開并初始化所述音頻解碼器中與所述音頻流格式相匹配的解碼器,申請(qǐng)內(nèi)存資源作為解碼輸入緩沖;讀取步驟包括通過所述解包裝組件讀取音頻編碼數(shù)據(jù)至所述輸入緩沖,進(jìn)行音頻解碼;更新所述本地的媒體元數(shù)據(jù)中的采樣率數(shù)據(jù)為所述音頻編碼數(shù)據(jù)的采樣率;根據(jù)本地的媒體元數(shù)據(jù)計(jì)算得到解碼輸出數(shù)據(jù)的時(shí)間戳并保持至所述輸出緩沖,從所述輸出緩沖返回?cái)y帶時(shí)間戳的原始音頻數(shù)據(jù);停止步驟包括釋放所述開始接口模塊申請(qǐng)作為解碼輸出緩沖和解碼輸入緩沖的內(nèi)存資源。在更加具體的實(shí)施方式中,上述各個(gè)步驟的具體過程如下文所述
如圖4所示,音頻解碼系統(tǒng)構(gòu)造步驟具體包括
步驟一保存AwesomePlayer輸入的 解包裝組件并依次通過ffmpeg工具箱的av_register_all> avcodec_init 和 avcodec_register_all 完成其支持格式的解碼器注冊(cè);步驟二 通過解包裝組件獲取音頻媒體元數(shù)據(jù)的地址。本實(shí)施例設(shè)計(jì)的android媒體元數(shù)據(jù)對(duì)音頻解碼系統(tǒng)數(shù)據(jù)項(xiàng)的組織形式如表2所示
表2音頻解碼系統(tǒng)媒體元數(shù)據(jù)
—keyIyalue
__別名値類型I 典型値 __
■I字符
MIME 鍵 kKeyMMET>pe mmg! ^^audio-raw51 fmdCSimig
解 1 ! 宇 kKevDecoderComponem 'decC' ^ "MuliiAudioDccoder·' fmdCString
pmmkKeyClitmielCotiiic|32bit2j findlai32
采獅kKeySampleRate1Site'|32bit44IOO(Hz)fmdliil32
持鐘__kKevDuration'dma'|64bit180000000##}findlm64
上下文環(huán)境; kKeyPIai fomi Privat e'priv'j指計(jì)AVF oral at C ontext * findPomter
麵纖號(hào)kKet-AudioSireaniNma| !addc’J32bk IIfindlat32
時(shí)聞戳kKeyTime'time'[64bit90000000滿秒)fimgnte4
媒體元數(shù)據(jù)中的key值必須唯一,獲取數(shù)據(jù)項(xiàng)時(shí)需指定key值和存儲(chǔ)value值的地址,如存儲(chǔ)地址為meta的媒體元數(shù)據(jù)中聲道數(shù)的獲取方法為meta->findlnt32(kKeyChannelCount, &mNumChannels)
填充數(shù)據(jù)項(xiàng)的方法與獲取數(shù)據(jù)項(xiàng)方法一一對(duì)應(yīng),如setlnt32對(duì)應(yīng)findlnt32。填充數(shù)據(jù)項(xiàng)時(shí)需指定key值和value值。步驟三通過相應(yīng)獲取方法,從步驟二得到的媒體元數(shù)據(jù)中獲取音頻聲道數(shù)、采樣率和持續(xù)時(shí)間信息;
步驟四通過系統(tǒng)內(nèi)媒體元數(shù)據(jù)的setlnt32和setlnt64填充方法,將步驟三得到的音頻聲道數(shù)、采樣率和持續(xù)時(shí)間信息復(fù)制至本地;
步驟五通過本地媒體元數(shù)據(jù)的setCString填充其“MME類型”和“解碼系統(tǒng)名字”數(shù)據(jù)項(xiàng)。MME指多媒體文件格式,MIME類型有很多種,如普通文本、JPEG圖形和AVI文件等等,此處我們將之設(shè)為音頻RAW數(shù)據(jù),即"audio/raw"。音頻解碼插件名稱無特殊要求,我們將新插件取名為“MultiAudioDecoder”,取多格式音頻解碼之意。如圖5所示,開始步驟包括
步驟一獲取本地媒體元數(shù)據(jù)的地址;步驟二 通過findPointer從步驟一的媒體元數(shù)據(jù)中獲取“上下文環(huán)境”數(shù)據(jù)項(xiàng)。如表2所示,上下文環(huán)境是解包裝組件媒體元數(shù)據(jù)項(xiàng)之一,我們將其指向ffmpeg工具箱的AVFormatContext數(shù)據(jù)結(jié)構(gòu),其存儲(chǔ)了多媒體源URI、音頻編碼ID和音頻流信息等;
步驟三多媒體源中可能存在非音頻流,如視頻流和字幕流等,因此需將音頻流標(biāo)識(shí)出來,標(biāo)識(shí)方法很簡(jiǎn)單,只需獲取音頻流在多媒體流中的編號(hào),它可從步驟一得到的媒體元數(shù)據(jù)中獲取;
步驟四申請(qǐng)一個(gè)AVC0DEC_MAX_AUDI0_FRAME_SIZE+64長(zhǎng)度的輸出緩沖,為了保證緩沖不溢出,AVCODEC_MAX_AUDIO_FRAME_SIZE為音頻解碼輸出幀最大字節(jié)數(shù),等于192000。系統(tǒng)內(nèi)的數(shù)據(jù)緩沖均以android stagefright框架下MediaBuffer的形式組織,如圖6所示。MediaBuffer —旦創(chuàng)建,其可用空間的起始地址和大小便固定了,其中有效數(shù)據(jù)的位置信息包括地址偏移量和尺寸。有效數(shù)據(jù)位置信息根據(jù)實(shí)際應(yīng)用不斷變化,利用“set_range (地址偏移量,尺寸)”對(duì)其進(jìn)行更新。
步驟五依次通過ffmpeg 工具箱的 avcodec_f ind_decoder 和 avcodec_open 找到并打開與被解碼格式ID匹配的音頻解碼器;
步驟六申請(qǐng)內(nèi)存資源作為解碼輸入緩沖,緩沖容量為AUDI0_REFILL_THRESH*2字節(jié),AUDIO_REFILL_THRESH為8192,并將其待解碼數(shù)據(jù)量和地址偏移量均設(shè)置為O。AUD10_REFILL_THRESH為開始音頻解碼所需數(shù)據(jù)量的閾值。如圖7所示,讀取步驟包括
步驟一獲取輸出緩沖,作為后續(xù)所有步驟的解碼輸出緩沖;
步驟二 設(shè)置音頻解碼所需最少字節(jié)數(shù)為AUDIO_REFILL_THRESH,以避免部分格式因數(shù)據(jù)不足而導(dǎo)致解碼失敗,AUDIO_REFILL_THRESH為8192 ;
步驟三判斷解碼輸入緩沖中待解碼數(shù)據(jù)是否小于AUDIO_REFILL_THRESH字節(jié),若是,則滑動(dòng)輸入緩沖中待解碼數(shù)據(jù),使得其地址偏移量恢復(fù)為O ;若不是,跳過該步驟;
步驟四如果輸入緩沖中待解碼數(shù)據(jù)小于AUDIO_REFILL_THRESH,則通過解包裝組件從多媒體源中讀取音頻流數(shù)據(jù),并將這些數(shù)據(jù)添加到緩沖待解碼數(shù)據(jù)尾部,并累加待解碼數(shù)據(jù)的字節(jié)數(shù)、保存當(dāng)前音頻包的時(shí)間戳等;如果待解碼數(shù)據(jù)的字節(jié)數(shù)仍小于AUDI0_REFILL_THRESH,則繼續(xù)步驟四,否則進(jìn)入步驟五;
步驟五通過ffmpeg工具箱的avcodec_decode_audio2對(duì)待解碼數(shù)據(jù)進(jìn)行解碼,解碼輸出存儲(chǔ)在步驟一的緩沖中,記解碼輸出字節(jié)數(shù)為output_frame_size,記avcodec_decode_audio2從輸入緩沖中消耗的字節(jié)數(shù)為byte_used ;
步驟六通過輸入緩沖的set_range,將其待解碼數(shù)據(jù)的地址偏移量加byte_used而字節(jié)數(shù)減 byte_used ;
步驟七若output_frame_size小于或等于O,則回到步驟三,否則進(jìn)入步驟八;步驟三至步驟七的滑動(dòng)式輸入緩沖狀態(tài)變化如圖3所示;
步驟八通過輸出緩沖的setjange,將其有效數(shù)據(jù)的地址偏移量和尺寸分別設(shè)置為O和 output_frame_size ;
步驟九根據(jù)步驟四得到的音頻包時(shí)間戳、本地媒體元數(shù)據(jù)中的采樣率和聲道數(shù)、解碼輸出的總采樣點(diǎn)數(shù)等,計(jì)算得到解碼輸出數(shù)據(jù)的時(shí)間戳,該時(shí)間戳烙在輸出緩沖上,與解碼輸出數(shù)據(jù)一起返回,以供音視頻同步;步驟十將攜帶時(shí)間戳信息的解碼輸出緩沖buffer返回。讀取步驟解碼過程中解碼過程中一個(gè)比較典型的輸入緩沖的變化過程如圖2所示。圖2中箭頭指向待解碼數(shù)據(jù)起始地址,黑色部分為待解碼數(shù)據(jù),白色部分為空閑空間,最多可容納AUDI0_REFILL_THRESH*2個(gè)待解碼字節(jié)。剛開始時(shí),緩沖為狀態(tài)I ;隨著解包裝組件讀取音頻流并填充該輸入緩沖,緩沖進(jìn)入狀態(tài)2,狀態(tài)2待解碼數(shù)據(jù)仍小于AUDI0_REFILL_THRESH,即小于緩沖容量的一半,解包裝組件將繼續(xù)讀取數(shù)據(jù),直到該輸入緩沖的有效數(shù)據(jù)大于AUDIO_REFILL_THRESH,進(jìn)入狀態(tài)3 ;進(jìn)入狀態(tài)3后便可以開始音頻解碼了 ;解碼過程會(huì)消耗緩沖中待解碼數(shù)據(jù),導(dǎo)致數(shù)據(jù)慢慢減少,進(jìn)入狀態(tài)4,在狀態(tài)4下,剩余的待解碼數(shù)據(jù)量仍大于AUDIO_REFILL_THRESH,則繼續(xù)停留在狀態(tài)4進(jìn)行解碼,直到數(shù)據(jù)量小于AUDIO_REFILL_THRESH,進(jìn)入狀態(tài)5 ;在狀態(tài)5下,需滑動(dòng)殘余數(shù)據(jù)至首地址,避免緩沖溢出,最后回到狀態(tài)2。輸入緩沖的狀態(tài)轉(zhuǎn)移圖如圖3所示,其中輸入緩沖各個(gè)正常狀態(tài)如表I所示。
表I輸入緩沖正常狀態(tài) _
權(quán)利要求
1.一種適配android stagefright多媒體框架的音頻解碼方法,其特征在于,包括以下步驟 音頻解碼系統(tǒng)構(gòu)造步驟保存AwesomePlayer輸入的解包裝組件,完成音頻解碼器的注冊(cè);通過所述解包裝組件獲取音頻的媒體元數(shù)據(jù)并保存至本地; 開始步驟從本地的媒體元數(shù)據(jù)中獲取上下文環(huán)境數(shù)據(jù)項(xiàng),申請(qǐng)內(nèi)存資源作為解碼輸出緩沖;以及根據(jù)所述上下文環(huán)境,打開并初始化所述音頻解碼器中與所述音頻流格式相匹配的解碼器,申請(qǐng)內(nèi)存資源作為解碼輸入緩沖; 讀取步驟通過所述解包裝組件讀取音頻編碼數(shù)據(jù)至所述輸入緩沖,進(jìn)行音頻解碼;更新所述本地的媒體元數(shù)據(jù)中的采樣率數(shù)據(jù)為所述音頻編碼數(shù)據(jù)的采樣率;根據(jù)本地的媒體元數(shù)據(jù)計(jì)算得到解碼輸出數(shù)據(jù)的時(shí)間戳并保持至所述輸出緩沖,從所述輸出緩沖返回?cái)y帶時(shí)間戳的原始音頻數(shù)據(jù); 停止步驟釋放所述開始接口模塊申請(qǐng)的作為解碼輸出緩沖和解碼輸入緩沖的內(nèi)存資源。
2.根據(jù)權(quán)利要求I所述的解碼方法,其特征在于所述音頻解碼系統(tǒng)構(gòu)造步驟包括 1-1)保存AwesomePlayer輸入的解包裝組件,通過ffmpeg工具箱完成其支持格式的音頻解碼器的注冊(cè); 1-2)通過所述解包裝組件獲取音頻的媒體元數(shù)據(jù); 1-3)在步驟1-2)得到的媒體元數(shù)據(jù)中獲取音頻聲道數(shù)、采樣率、和持續(xù)時(shí)間信息; 1-4)將步驟1-3)得到的音頻聲道數(shù)、采樣率、和持續(xù)時(shí)間信息復(fù)制保存至本地的媒體元數(shù)據(jù)中。
3.根據(jù)權(quán)利要求I所述的解碼方法,其特征在于,所述開始步驟包括 2-1)獲取所述本地的媒體元數(shù)據(jù)的地址; 2-2)從所述本地的媒體元數(shù)據(jù)中獲取上下文環(huán)境數(shù)據(jù)項(xiàng); 2-3)從所述本地的媒體元數(shù)據(jù)中獲取音頻流在多媒體源中的編號(hào),通過該編號(hào)判斷從多媒體源中獲取的流是否為音頻流,若是,則進(jìn)行解碼,否則跳過; 2-4)申請(qǐng)一個(gè)容量大于音頻解碼最大輸出字節(jié)數(shù)的內(nèi)存資源作為輸出緩沖; 2-5)通過ffmpeg工具箱找到并打開與所述上下文環(huán)境數(shù)據(jù)項(xiàng)中的解碼格式ID相匹配的解碼器; 2-6)申請(qǐng)一個(gè)容量大于AUDI0_REFILL_THRESH*2的內(nèi)存資源作為輸入緩沖,并將輸入緩沖中帶解碼數(shù)據(jù)的字節(jié)數(shù)和地址偏移量均初始化為0,其中,AUDIO_REFILL_THRESH為開始音頻解碼時(shí)所需數(shù)據(jù)量閾值。
4.根據(jù)權(quán)利要求I所述的解碼方法,其特征在于,所述讀取步驟包括 3-1)獲取輸出緩沖作為后續(xù)所有步驟的解碼輸出緩沖; 3-2)設(shè)置音頻解碼所需最少字節(jié)數(shù)為AUDIO_REFILL_THRESH,以避免因數(shù)據(jù)不足而導(dǎo)致解碼失敗; 3-3)判斷所述輸入緩沖中待解碼數(shù)據(jù)字節(jié)數(shù)是否小于閾值A(chǔ)UDIO_REFILL_THRESH,若是,則滑動(dòng)輸入緩沖中待解碼數(shù)據(jù),使得其地址偏移量恢復(fù)為0 ;若不是,跳過該步驟; 3-4)如果所述輸入緩沖中待解碼數(shù)據(jù)小于AUDIO_REFILL_THRESH,則通過解包裝組件從多媒體源中讀取音頻流數(shù)據(jù),并將這些新數(shù)據(jù)添加到輸入緩沖中待解碼數(shù)據(jù)的尾部,接著累加待解碼數(shù)據(jù)字節(jié)數(shù)、保存當(dāng)前音頻包的時(shí)間戳等;如果待解碼數(shù)據(jù)的字節(jié)數(shù)仍小于AUDIO_REFILL_THRESH,則繼續(xù)步驟3_4),否則進(jìn)入步驟3_5); 3-5)通過ffmpeg工具箱對(duì)輸入緩沖中待解碼數(shù)據(jù)進(jìn)行解碼,解碼輸出數(shù)據(jù)存儲(chǔ)在步驟3-1)獲取的輸出緩沖中,記解碼輸出字節(jié)數(shù)為output_frame_size, ffmpeg工具箱從輸入緩沖中消耗的字節(jié)數(shù)為byte_used ; 3-6)將輸入緩沖待解碼數(shù)據(jù)的地址偏移量加byte_used而字節(jié)數(shù)減byte_used ; 3-7)若output_frame_size小于或等于O,則回到步驟3-3),否則進(jìn)入步驟3-8); 3-8)將輸出緩沖的地址偏移量和字節(jié)總數(shù)分別設(shè)置為O和output_frame_size ; 3-9)根據(jù)步驟3-4)得到的音頻包時(shí)間戳、媒體元數(shù)據(jù)的采樣率和聲道數(shù),以及解碼累計(jì)輸出總采樣點(diǎn)數(shù)等計(jì)算得到解碼輸出數(shù)據(jù)的時(shí)間戳;· 3-10)將攜帶時(shí)間戳信息的解碼輸出緩沖返回。
5.一種適配android stagefright多媒體框架的音頻解碼系統(tǒng),其特征在于,包括音頻解碼系統(tǒng)構(gòu)造模塊,用于保存AwesomePlayer輸入的解包裝組件,完成音頻解碼器的注冊(cè);通過所述解包裝組件獲取音頻的媒體元數(shù)據(jù)并保存至本地; 開始接口模塊,用于從本地的媒體元數(shù)據(jù)中獲取上下文環(huán)境數(shù)據(jù)項(xiàng),申請(qǐng)內(nèi)存資源作為解碼輸出緩沖;以及根據(jù)所述上下文環(huán)境,打開并初始化所述音頻解碼器中與所述音頻流格式相匹配的解碼器,申請(qǐng)內(nèi)存資源作為解碼輸入緩沖; 讀取接口模塊,用于通過所述解包裝組件讀取音頻編碼數(shù)據(jù)至所述輸入緩沖,進(jìn)行音頻解碼;更新所述本地的媒體元數(shù)據(jù)中的采樣率數(shù)據(jù)為所述音頻編碼數(shù)據(jù)的采樣率;根據(jù)本地的媒體元數(shù)據(jù)計(jì)算得到解碼輸出數(shù)據(jù)的時(shí)間戳并保持至所述輸出緩沖,從所述輸出緩沖返回?cái)y帶時(shí)間戳的原始音頻數(shù)據(jù); 停止接口模塊,用于釋放所述開始接口模塊申請(qǐng)作為解碼輸出緩沖和解碼輸入緩沖的內(nèi)存資源。
全文摘要
本發(fā)明公開了一種適配android stagefright多媒體框架的音頻解碼方法和系統(tǒng),方法包括以下步驟保存Awesome Player輸入的解包裝組件,完成音頻解碼器的注冊(cè);獲取音頻的媒體元數(shù)據(jù)并保存至本地;獲取上下文環(huán)境數(shù)據(jù)項(xiàng),申請(qǐng)內(nèi)存資源作為解碼輸出緩沖;以及根據(jù)上下文環(huán)境,打開并初始化所述音頻解碼器中與音頻流格式相匹配的解碼器,申請(qǐng)內(nèi)存資源作為解碼輸入緩沖;通過解包裝組件讀取音頻編碼數(shù)據(jù)至輸入緩沖,進(jìn)行音頻解碼;更新本地的媒體元數(shù)據(jù)中的采樣率數(shù)據(jù)為音頻編碼數(shù)據(jù)的采樣率;根據(jù)本地的媒體元數(shù)據(jù)計(jì)算得到解碼輸出數(shù)據(jù)的時(shí)間戳并保持至輸出緩沖,從輸出緩沖返回?cái)y帶時(shí)間戳的原始音頻數(shù)據(jù)。本發(fā)明能夠擴(kuò)展安卓系統(tǒng)對(duì)音頻格式的支持。
文檔編號(hào)H04N21/8547GK102857833SQ201210389419
公開日2013年1月2日 申請(qǐng)日期2012年10月15日 優(yōu)先權(quán)日2012年10月15日
發(fā)明者溫偉, 涂睿, 高見, 胡勇, 劉睿 申請(qǐng)人:深圳市佳創(chuàng)軟件有限公司
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
1
米泉市| 湖北省| 浏阳市| 贡嘎县| 江安县| 宁河县| SHOW| 天等县| 平塘县| 汕头市| 阿图什市| 若羌县| 六枝特区| 乐昌市| 宽甸| 城市| 崇左市| 曲周县| 文成县| 长宁县| 涿鹿县| 宁乡县| 罗甸县| 莱西市| 绥芬河市| 西畴县| 古蔺县| 洮南市| 宾阳县| 循化| 招远市| 中西区| 萨嘎县| 桐乡市| 南乐县| 万安县| 南康市| 云和县| 灌云县| 皋兰县| 贵阳市|