溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Android中AudioTrack如何使用

發(fā)布時(shí)間:2021-07-12 11:37:53 來源:億速云 閱讀:138 作者:Leah 欄目:移動(dòng)開發(fā)

Android中AudioTrack如何使用,很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。

1、Android AudioTrack簡介

在android中播放聲音可以用MediaPlayer和AudioTrack兩種方案的,但是兩種方案是有很大區(qū)別的,MediaPlayer可以播放多種格式的聲音文件,例如MP3,AAC,WAV,OGG,MIDI等。而AudioTrack只能播放PCM數(shù)據(jù)流。

事實(shí)上,兩種本質(zhì)上是沒啥區(qū)別的,MediaPlayer在播放音頻時(shí),在framework層還是會(huì)創(chuàng)建AudioTrack,把解碼后的PCM數(shù)流傳遞給AudioTrack,最后由AudioFlinger進(jìn)行混音,傳遞音頻給硬件播放出來。利用AudioTrack播放只是跳過Mediaplayer的解碼部分而已。Mediaplayer的解碼核心部分是基于OpenCORE 來實(shí)現(xiàn)的,支持通用的音視頻和圖像格式,codec使用的是OpenMAX接口來進(jìn)行擴(kuò)展。因此使用audiotrack播放mp3文件的話,要自己加入一個(gè)音頻解碼器,如libmad。否則只能播放PCM數(shù)據(jù),如大多數(shù)WAV格式的音頻文件。

如果是實(shí)時(shí)的音頻數(shù)據(jù),那么只能用AudioTrack進(jìn)行播放。

2、如何使用AudioTrack進(jìn)行音頻播放

//根據(jù)采樣率,采樣精度,單雙聲道來得到frame的大小。  
int bufsize = AudioTrack.getMinBufferSize(8000,//每秒8K個(gè)點(diǎn)  
  AudioFormat.CHANNEL_CONFIGURATION_STEREO,//雙聲道 
  AudioFormat.ENCODING_PCM_16BIT);//一個(gè)采樣點(diǎn)16比特-2個(gè)字節(jié) 
 
//注意,按照數(shù)字音頻的知識(shí),這個(gè)算出來的是一秒鐘buffer的大小。 
//創(chuàng)建AudioTrack 
 
AudioTrack trackplayer = new AudioTrack(AudioManager.STREAM_MUSIC, 8000, 
  AudioFormat.CHANNEL_CONFIGURATION_ STEREO, 
  AudioFormat.ENCODING_PCM_16BIT, 
  bufsize, 
 
AudioTrack.MODE_STREAM);// 
trackplayer.play() ;//開始 
trackplayer.write(bytes_pkg, 0, bytes_pkg.length) ;//往track中寫數(shù)據(jù) 
 
…. 
 
trackplayer.stop();//停止播放  
trackplayer.release();//釋放底層資源。

這里需要解釋下兩個(gè)東西:

1.AudioTrack.MODE_STREAM:

AudioTrack中有MODE_STATIC和MODE_STREAM兩種分類。STREAM的意思是由用戶在應(yīng)用程序通過write方式把數(shù)據(jù)一次一次得寫到audiotrack中。這個(gè)和我們在socket中發(fā)送數(shù)據(jù)一樣,應(yīng)用層從某個(gè)地方獲取數(shù)據(jù),例如通過編解碼得到PCM數(shù)據(jù),然后write到audiotrack。

這種方式的壞處就是總是在JAVA層和Native層交互,效率損失較大。

而STATIC的意思是一開始創(chuàng)建的時(shí)候,就把音頻數(shù)據(jù)放到一個(gè)固定的buffer,然后直接傳給audiotrack,后續(xù)就不用一次次得write了。AudioTrack會(huì)自己播放這個(gè)buffer中的數(shù)據(jù)。

這種方法對(duì)于鈴聲等內(nèi)存占用較小,延時(shí)要求較高的聲音來說很適用。

2.StreamType

這個(gè)在構(gòu)造AudioTrack的第一個(gè)參數(shù)中使用。這個(gè)參數(shù)和Android中的AudioManager有關(guān)系,涉及到手機(jī)上的音頻管理策略。
Android將系統(tǒng)的聲音分為以下幾類常見的(未寫全):

 STREAM_ALARM:警告聲
 STREAM_MUSCI:音樂聲,例如music等
 STREAM_RING:鈴聲
 STREAM_SYSTEM:系統(tǒng)聲音
 STREAM_VOCIE_CALL:電話聲音

為什么要分這么多呢?以前在臺(tái)式機(jī)上開發(fā)的時(shí)候很少知道有這么多的聲音類型,不過仔細(xì)思考下,發(fā)現(xiàn)這樣做是有道理的。例如你在聽music的時(shí)候接到電話,這個(gè)時(shí)候music播放肯定會(huì)停止,此時(shí)你只能聽到電話,如果你調(diào)節(jié)音量的話,這個(gè)調(diào)節(jié)肯定只對(duì)電話起作用。當(dāng)電話打完了,再回到music,你肯定不用再調(diào)節(jié)音量了。

其實(shí)系統(tǒng)將這幾種聲音的數(shù)據(jù)分開管理,所以,這個(gè)參數(shù)對(duì)AudioTrack來說,它的含義就是告訴系統(tǒng),我現(xiàn)在想使用的是哪種類型的聲音,這樣系統(tǒng)就可以對(duì)應(yīng)管理他們了。

代碼里首先獲取最小的分配內(nèi)存,然后創(chuàng)建AudioTrack,最后通過mAudioTrack.write(data, offset, length);將音頻數(shù)據(jù)進(jìn)行播放。

看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝您對(duì)億速云的支持。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI