還有一篇:http://blog.51cto.com/13591594/2068009 (其項目地址: https://github.com/979451341/Audio-and-video-learning-materials )android
今天,簡單講講AudioTrack的使用方法。git
一、Android AudioTrack簡介github
在android中播放聲音能夠用MediaPlayer和AudioTrack兩種方案的,可是兩種方案是有很大區別的,MediaPlayer能夠播放多種格式的聲音文件,例如MP3,AAC,WAV,OGG,MIDI等。而AudioTrack只能播放PCM數據流。socket
事實上,兩種本質上是沒啥區別的,MediaPlayer在播放音頻時,在framework層仍是會建立AudioTrack,把解碼後的PCM數流傳遞給AudioTrack,最後由AudioFlinger進行混音,傳遞音頻給硬件播放出來。利用AudioTrack播放只是跳過Mediaplayer的解碼部分而已。Mediaplayer的解碼核心部分是基於OpenCORE 來實現的,支持通用的音視頻和圖像格式,codec使用的是OpenMAX接口來進行擴展。所以使用audiotrack播放mp3文件的話,要本身加入一個音頻解碼qi,如libmad。不然只能播放PCM數據,如大多數WAV格式的音頻文件。ide
若是是實時的音頻數據,那麼只能用AudioTrack進行播放。學習
二、如何使用AudioTrack進行音頻播放code
? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 //根據採樣率,採樣精度,單雙聲道來獲得frame的大小。
int bufsize = AudioTrack.getMinBufferSize(8000,//每秒8K個點
AudioFormat.CHANNEL_CONFIGURATION_STEREO,//雙聲道 AudioFormat.ENCODING_PCM_16BIT);//一個採樣點16比特-2個字節orm
//注意,按照數字音頻的知識,這個算出來的是一秒鐘buffer的大小。 //建立AudioTrack視頻
AudioTrack trackplayer = new AudioTrack(AudioManager.STREAM_MUSIC, 8000, AudioFormat.CHANNEL_CONFIGURATION_ STEREO, AudioFormat.ENCODING_PCM_16BIT, bufsize,blog
AudioTrack.MODE_STREAM);// trackplayer.play() ;//開始 trackplayer.write(bytes_pkg, 0, bytes_pkg.length) ;//往track中寫數據
….
trackplayer.stop();//中止播放
trackplayer.release();//釋放底層資源。 這裏須要解釋下兩個東西: 1.AudioTrack.MODE_STREAM: AudioTrack中有MODE_STATIC和MODE_STREAM兩種分類。STREAM的意思是由用戶在應用程序經過write方式把數據一次一次得寫到audiotrack中。這個和咱們在socket中發送數據同樣,應用層從某個地方獲取數據,例如經過編解碼獲得PCM數據,而後write到audiotrack。 這種方式的壞處就是老是在JAVA層和Native層交互,效率損失較大。 而STATIC的意思是一開始建立的時候,就把音頻數據放到一個固定的buffer,而後直接傳給audiotrack,後續就不用一次次得write了。AudioTrack會本身播放這個buffer中的數據。 這種方法對於鈴聲等內存佔用較小,延時要求較高的聲音來講很適用。 2.StreamType
這個在構造AudioTrack的第一個參數中使用。這個參數和Android中的AudioManager有關係,涉及到手機上的音頻管理策略。 Android將系統的聲音分爲如下幾類常見的(未寫全): STREAM_ALARM:警告聲 STREAM_MUSCI:音樂聲,例如music等 STREAM_RING:鈴聲 STREAM_SYSTEM:系統聲音 STREAM_VOCIE_CALL:電話聲音 爲何要分這麼多呢?之前在臺式機上開發的時候不多知道有這麼多的聲音類型,不過仔細思考下,發現這樣作是有道理的。例如你在聽music的時候接到電話,這個時候music播放確定會中止,此時你只能聽到電話,若是你調節音量的話,這個調節確定只對電話起做用。當電話打完了,再回到music,你確定不用再調節音量了。 其實系統將這幾種聲音的數據分開管理,因此,這個參數對AudioTrack來講,它的含義就是告訴系統,我如今想使用的是哪一種類型的聲音,這樣系統就能夠對應管理他們了。
代碼裏首先獲取最小的分配內存,而後建立AudioTrack,最後經過mAudioTrack.write(data, offset, length);將音頻數據進行播放。
android音頻系統之AudioTrack的使用就講完了。
就這麼簡單。
以上就是本文的所有內容,但願對你們的學習有所幫助,也但願你們多多支持腳本之家。