本發(fā)明專利技術(shù)公開了一種Linux平臺(tái)上安卓應(yīng)用低延遲音頻輸出方法,通過獲取Linux系統(tǒng)中安卓兼容環(huán)境中安卓應(yīng)用所采用的音頻播放器的類型確定音頻的輸出方式,且不同的輸出方式均有效減少了安卓應(yīng)用在音頻播放過程所涉及的進(jìn)程,縮減了進(jìn)程間的數(shù)據(jù)交互,有效提高了安卓應(yīng)用的音頻輸出效率,降低了輸出延時(shí),改善了用戶體驗(yàn)。用戶體驗(yàn)。用戶體驗(yàn)。
【技術(shù)實(shí)現(xiàn)步驟摘要】
一種Linux平臺(tái)上安卓應(yīng)用低延遲音頻輸出方法
[0001]本專利技術(shù)屬于桌面操作系統(tǒng)上運(yùn)行移動(dòng)應(yīng)用的開發(fā)
,具體涉及一種Linux平臺(tái)上安卓應(yīng)用低延遲音頻輸出方法。
技術(shù)介紹
[0002]音頻數(shù)據(jù)處理是安卓系統(tǒng)非常重要的組成部分,負(fù)責(zé)音頻數(shù)據(jù)的采集和輸出、音頻流的控制、音頻設(shè)備的管理及音量調(diào)節(jié)等,主要包括音頻應(yīng)用框架(Audio Application Framework)、音頻本地框架(Audio Native Framework)、音頻服務(wù)(Audio Services)和音頻硬件抽象層(Audio HAL)。此外,與音頻數(shù)據(jù)處理強(qiáng)相關(guān)的有 MultiMedia,MultiMedia 負(fù)責(zé)音視頻的編解碼,MultiMedia 將解碼后的數(shù)據(jù)通過 AudioTrack 輸出,而 AudioRecord 采集的錄音數(shù)據(jù)交由 MultiMedia 進(jìn)行編碼。
[0003]一般情況下,安卓系統(tǒng)中安卓應(yīng)用播放音頻可采用MediaPlayer 和 AudioTrack。其中,MediaPlayer支持播放多種格式的音源,如:mp3、flac、wma、ogg、wav等,MediaPlayer的實(shí)現(xiàn)過程中先在 Native 層創(chuàng)建對(duì)應(yīng)的音頻解碼器和AudioTrack,并將由音頻解碼器解碼后的數(shù)據(jù)交由AudioTrack進(jìn)行輸出,由此可見,MediaPlayer的應(yīng)用場(chǎng)景更廣使用也更方便。AudioTrack僅支持播放解碼后的 PCM 數(shù)據(jù)流,通常在對(duì)聲音時(shí)延要求非常苛刻的應(yīng)用場(chǎng)景才需要用到AudioTrack。
[0004]安卓系統(tǒng)中安卓應(yīng)用播放音頻的過程為:MediaPlayer解析音頻文件格式,然后調(diào)用解碼器生成PCM格式音頻數(shù)據(jù),再將PCM音頻數(shù)據(jù)傳輸給AudioTrack;AudioTrack將音頻數(shù)據(jù)傳輸給AudioFlinger;AudioFlinger混音后調(diào)用音頻設(shè)備的HAL接口,由音頻設(shè)備的HAL接口操作音頻設(shè)備輸出音頻。
[0005]綜上所述,由于安卓系統(tǒng)中安卓應(yīng)用輸出音頻的操作過程所涉及的中間層、進(jìn)程較多,音頻數(shù)據(jù)處理流程較為復(fù)雜,數(shù)據(jù)傳輸過程的開銷較大,因此導(dǎo)致安卓應(yīng)用的音頻輸出效率較低,輸出延時(shí)較大,很大程度上影響用戶體驗(yàn),現(xiàn)有運(yùn)行于Linux平臺(tái)上的安卓兼容環(huán)境內(nèi)一般是基于安卓系統(tǒng)的音頻輸出機(jī)制實(shí)現(xiàn)的安卓應(yīng)用的音頻輸出,因此仍存在上述問題。
技術(shù)實(shí)現(xiàn)思路
[0006]有鑒于此,本專利技術(shù)提供了一種Linux平臺(tái)上安卓應(yīng)用低延遲音頻輸出方法,能夠針對(duì)不同的音頻播放器及不同的音頻文件輸出標(biāo)識(shí)動(dòng)態(tài)確定音頻輸出方式從而實(shí)現(xiàn)低延遲的音頻輸出。
[0007]本專利技術(shù)提供的一種Linux平臺(tái)上安卓應(yīng)用低延遲音頻輸出方法,包括以下步驟:步驟1、安卓應(yīng)用需要輸出音頻時(shí),若當(dāng)前安卓兼容環(huán)境中不存在其他安卓應(yīng)用正在輸出音頻,則安卓應(yīng)用獲取音頻焦點(diǎn)執(zhí)行步驟2;否則執(zhí)行步驟6;步驟2、若安卓應(yīng)用采用MediaPlayer輸出音頻則執(zhí)行步驟3,若安卓應(yīng)用采用AudioTrack輸出音頻則執(zhí)行步驟4;
步驟3、讀取待輸出音頻后,采用解碼器逐幀解碼待輸出音頻得到解碼音頻文件,再基于PulseAudio接口逐幀將解碼音頻文件輸出到Linux音頻設(shè)備,在安卓應(yīng)用完成音頻輸出后執(zhí)行步驟5;步驟4、讀取待輸出音頻獲取其輸出標(biāo)識(shí),根據(jù)輸出標(biāo)識(shí)輸出待輸出音頻,在安卓應(yīng)用完成音頻輸出后執(zhí)行步驟5;步驟5、安卓應(yīng)用釋放音頻焦點(diǎn),并檢測(cè)安卓兼容環(huán)境內(nèi)的暫停音頻流隊(duì)列,如果暫停音頻流隊(duì)列中存在被暫停的音頻流,則選取暫停音頻流隊(duì)列中最早暫停的音頻流繼續(xù)播放,結(jié)束本流程;如果沒有,則結(jié)束本流程;步驟6、安卓應(yīng)用請(qǐng)求獲取音頻焦點(diǎn),若安卓應(yīng)用未能獲取音頻焦點(diǎn),則等待設(shè)定時(shí)間間隔后執(zhí)行步驟6;若安卓應(yīng)用獲取了音頻焦點(diǎn),則暫停當(dāng)前音頻的輸出,并等待當(dāng)前音頻解碼完畢后,將當(dāng)前音頻作為暫停音頻流追加到安卓兼容環(huán)境的暫停音頻流隊(duì)列中,執(zhí)行步驟2。
[0008]進(jìn)一步地,所述步驟3中基于解碼器逐幀解碼待輸出音頻得到解碼音頻文件,再基于PulseAudio接口逐幀將解碼音頻文件輸出到Linux音頻設(shè)備包括:將待輸出音頻讀入內(nèi)存緩沖區(qū);采用解碼單元從內(nèi)存緩沖區(qū)逐幀讀取待輸出音頻并解碼得到解碼音頻文件,將解碼音頻文件寫入解碼內(nèi)存緩沖區(qū)后;再使用輸出單元從解碼內(nèi)存緩沖區(qū)中讀取解碼音頻文件,并根據(jù)碼率確定輸出間隔,按照輸出間隔采用PulseAudio接口逐幀輸出到Linux音頻設(shè)備。
[0009]進(jìn)一步地,所述解碼單元及輸出單元均為以Native函數(shù)的方式實(shí)現(xiàn)。
[0010]進(jìn)一步地,在所述將待輸出音頻讀入內(nèi)存緩沖區(qū)之前,根據(jù)待輸出音頻的數(shù)據(jù)源確定待輸出音頻的類型,若待輸出音頻的類型為本地音頻文件,則將本地音頻文件一次性讀入內(nèi)存緩沖區(qū),再根據(jù)音頻文件的編碼格式、壓縮比及編碼文件大小確定音頻文件解碼后的解碼音頻文件大小,根據(jù)解碼音頻文件大小分配用于存放解碼音頻文件的解碼內(nèi)存緩沖區(qū);若待輸出音頻為網(wǎng)絡(luò)音頻流,則將待輸出音頻逐幀讀入內(nèi)存緩沖區(qū)。
[0011]進(jìn)一步地,所述按照輸出間隔采用PulseAudio接口逐幀輸出到Linux音頻設(shè)備時(shí)采用Linux系統(tǒng)的計(jì)時(shí)器接口進(jìn)行計(jì)時(shí)。
[0012]進(jìn)一步地,所述步驟4中根據(jù)輸出標(biāo)識(shí)輸出待輸出音頻包括:當(dāng)輸出標(biāo)識(shí)為AUDIO_OUTPUT_FLAG_DIRECT時(shí),采用ALSA接口將待輸出音頻輸出至Linux音頻設(shè)備;當(dāng)輸出標(biāo)識(shí)為AUDIO_OUTPUT_FLAG_PRIMARY時(shí),將待輸出音頻發(fā)送至AudioFlinger;當(dāng)輸出標(biāo)識(shí)為AUDIO_OUTPUT_FLAG_FAST時(shí),若安卓應(yīng)用以獨(dú)占方式使用ALSA接口則采用ALSA接口將待輸出音頻輸出至Linux音頻設(shè)備;否則采用PulseAudio將待輸出音頻輸出至Linux音頻設(shè)備;當(dāng)輸出標(biāo)識(shí)為AUDIO_OUTPUT_FLAG_DEEP_BUFFER時(shí),采用PulseAudio將待輸出音頻輸出至Linux音頻設(shè)備;當(dāng)輸出標(biāo)識(shí)為AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD時(shí),采用解碼器解碼待輸出音頻得到解碼音頻文件,若安卓應(yīng)用以獨(dú)占方式使用ALSA接口則采用ALSA接口將待輸出音頻輸出至Linux音頻設(shè)備;否則采用PulseAudio將待輸出音頻輸出至Linux音頻設(shè)備。
[0013]有益效果:本專利技術(shù)通過獲取Linux系統(tǒng)中安卓兼容環(huán)境中安卓應(yīng)用所采用的音頻播放器的類型確定音頻的輸出方式,且不同的輸出方式均有效減少了安卓應(yīng)用在音頻播放過程所涉及的進(jìn)程,縮減了進(jìn)程間的數(shù)據(jù)交互,有效提高了安卓應(yīng)用的音頻輸出效率,降低了輸出延時(shí),改善了用戶體驗(yàn)。
附圖說明
[0014]圖1為本專利技術(shù)提供的一種Linux平臺(tái)上安卓應(yīng)用低延遲音頻輸出方法的流程圖。
具體實(shí)施方式
[0015]下面結(jié)合附圖并舉實(shí)施例,對(duì)本專利技術(shù)進(jìn)行詳細(xì)描述。
[0016]本專利技術(shù)提供了一種Linux平臺(tái)上安卓應(yīng)用低延遲音頻輸出方法,其核心思想是:根據(jù)Linux系統(tǒng)內(nèi)安卓兼容環(huán)境中輸出音頻的情況,確定當(dāng)前待本文檔來自技高網(wǎng)...
【技術(shù)保護(hù)點(diǎn)】
【技術(shù)特征摘要】
1.一種Linux平臺(tái)上安卓應(yīng)用低延遲音頻輸出方法,其特征在于,包括以下步驟:步驟1、安卓應(yīng)用需要輸出音頻時(shí),若當(dāng)前安卓兼容環(huán)境中不存在其他安卓應(yīng)用正在輸出音頻,則安卓應(yīng)用獲取音頻焦點(diǎn)執(zhí)行步驟2;否則執(zhí)行步驟6;步驟2、若安卓應(yīng)用采用MediaPlayer輸出音頻則執(zhí)行步驟3,若安卓應(yīng)用采用AudioTrack輸出音頻則執(zhí)行步驟4;步驟3、讀取待輸出音頻后,采用解碼器逐幀解碼待輸出音頻得到解碼音頻文件,再基于PulseAudio接口逐幀將解碼音頻文件輸出到Linux音頻設(shè)備,在安卓應(yīng)用完成音頻輸出后執(zhí)行步驟5;步驟4、讀取待輸出音頻獲取其輸出標(biāo)識(shí),根據(jù)輸出標(biāo)識(shí)輸出待輸出音頻,在安卓應(yīng)用完成音頻輸出后執(zhí)行步驟5;步驟5、安卓應(yīng)用釋放音頻焦點(diǎn),并檢測(cè)安卓兼容環(huán)境內(nèi)的暫停音頻流隊(duì)列,如果暫停音頻流隊(duì)列中存在被暫停的音頻流,則選取暫停音頻流隊(duì)列中最早暫停的音頻流繼續(xù)播放,結(jié)束本流程;如果沒有,則結(jié)束本流程;步驟6、安卓應(yīng)用請(qǐng)求獲取音頻焦點(diǎn),若安卓應(yīng)用未能獲取音頻焦點(diǎn),則等待設(shè)定時(shí)間間隔后執(zhí)行步驟6;若安卓應(yīng)用獲取了音頻焦點(diǎn),則暫停當(dāng)前音頻的輸出,并等待當(dāng)前音頻解碼完畢后,將當(dāng)前音頻作為暫停音頻流追加到安卓兼容環(huán)境的暫停音頻流隊(duì)列中,執(zhí)行步驟2。2.根據(jù)權(quán)利要求1所述的一種Linux平臺(tái)上安卓應(yīng)用低延遲音頻輸出方法,其特征在于,所述步驟3中基于解碼器逐幀解碼待輸出音頻得到解碼音頻文件,再基于PulseAudio接口逐幀將解碼音頻文件輸出到Linux音頻設(shè)備包括:將待輸出音頻讀入內(nèi)存緩沖區(qū);采用解碼單元從內(nèi)存緩沖區(qū)逐幀讀取待輸出音頻并解碼得到解碼音頻文件,將解碼音頻文件寫入解碼內(nèi)存緩沖區(qū)后;再使用輸出單元從解碼內(nèi)存緩沖區(qū)中讀取解碼音頻文件,并根據(jù)碼率確定輸出間隔,按照輸出間隔采用PulseAudio接口逐幀輸出到Linux音頻設(shè)備。3.根據(jù)權(quán)利要求2所述的一種Linux平臺(tái)上安卓應(yīng)用低延遲音頻輸出方法,其特征在于,所述解碼單元及輸出單元均為以Native函數(shù)...
【專利技術(shù)屬性】
技術(shù)研發(fā)人員:溫研,
申請(qǐng)(專利權(quán))人:北京麟卓信息科技有限公司,
類型:發(fā)明
國(guó)別省市:
還沒有人留言評(píng)論。發(fā)表了對(duì)其他瀏覽者有用的留言會(huì)獲得科技券。