Android音頻系統(tǒng)AudioTrack使用方法詳解
今天,簡單講講AudioTrack的使用方法。
1、Android AudioTrack簡介
在android中播放聲音可以用MediaPlayer和AudioTrack兩種方案的,但是兩種方案是有很大區(qū)別的,MediaPlayer可以播放多種格式的聲音文件,例如MP3,AAC,WAV,OGG,MIDI等。而AudioTrack只能播放PCM數(shù)據(jù)流。
事實上,兩種本質(zhì)上是沒啥區(qū)別的,MediaPlayer在播放音頻時,在framework層還是會創(chuàng)建AudioTrack,把解碼后的PCM數(shù)流傳遞給AudioTrack,最后由AudioFlinger進行混音,傳遞音頻給硬件播放出來。利用AudioTrack播放只是跳過Mediaplayer的解碼部分而已。Mediaplayer的解碼核心部分是基于OpenCORE 來實現(xiàn)的,支持通用的音視頻和圖像格式,codec使用的是OpenMAX接口來進行擴展。因此使用audiotrack播放mp3文件的話,要自己加入一個音頻解碼器,如libmad。否則只能播放PCM數(shù)據(jù),如大多數(shù)WAV格式的音頻文件。
如果是實時的音頻數(shù)據(jù),那么只能用AudioTrack進行播放。
2、如何使用AudioTrack進行音頻播放
//根據(jù)采樣率,采樣精度,單雙聲道來得到frame的大小。 int bufsize = AudioTrack.getMinBufferSize(8000,//每秒8K個點 AudioFormat.CHANNEL_CONFIGURATION_STEREO,//雙聲道 AudioFormat.ENCODING_PCM_16BIT);//一個采樣點16比特-2個字節(jié) //注意,按照數(shù)字音頻的知識,這個算出來的是一秒鐘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();//釋放底層資源。
這里需要解釋下兩個東西:
1.AudioTrack.MODE_STREAM:
AudioTrack中有MODE_STATIC和MODE_STREAM兩種分類。STREAM的意思是由用戶在應用程序通過write方式把數(shù)據(jù)一次一次得寫到audiotrack中。這個和我們在socket中發(fā)送數(shù)據(jù)一樣,應用層從某個地方獲取數(shù)據(jù),例如通過編解碼得到PCM數(shù)據(jù),然后write到audiotrack。
這種方式的壞處就是總是在JAVA層和Native層交互,效率損失較大。
而STATIC的意思是一開始創(chuàng)建的時候,就把音頻數(shù)據(jù)放到一個固定的buffer,然后直接傳給audiotrack,后續(xù)就不用一次次得write了。AudioTrack會自己播放這個buffer中的數(shù)據(jù)。
這種方法對于鈴聲等內(nèi)存占用較小,延時要求較高的聲音來說很適用。
2.StreamType
這個在構造AudioTrack的第一個參數(shù)中使用。這個參數(shù)和Android中的AudioManager有關系,涉及到手機上的音頻管理策略。
Android將系統(tǒng)的聲音分為以下幾類常見的(未寫全):
STREAM_ALARM:警告聲
STREAM_MUSCI:音樂聲,例如music等
STREAM_RING:鈴聲
STREAM_SYSTEM:系統(tǒng)聲音
STREAM_VOCIE_CALL:電話聲音
為什么要分這么多呢?以前在臺式機上開發(fā)的時候很少知道有這么多的聲音類型,不過仔細思考下,發(fā)現(xiàn)這樣做是有道理的。例如你在聽music的時候接到電話,這個時候music播放肯定會停止,此時你只能聽到電話,如果你調(diào)節(jié)音量的話,這個調(diào)節(jié)肯定只對電話起作用。當電話打完了,再回到music,你肯定不用再調(diào)節(jié)音量了。
其實系統(tǒng)將這幾種聲音的數(shù)據(jù)分開管理,所以,這個參數(shù)對AudioTrack來說,它的含義就是告訴系統(tǒng),我現(xiàn)在想使用的是哪種類型的聲音,這樣系統(tǒng)就可以對應管理他們了。
代碼里首先獲取最小的分配內(nèi)存,然后創(chuàng)建AudioTrack,最后通過mAudioTrack.write(data, offset, length);將音頻數(shù)據(jù)進行播放。
android音頻系統(tǒng)之AudioTrack的使用就講完了。
就這么簡單。
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
Android CountDownTimer實現(xiàn)定時器和倒計時效果
這篇文章主要為大家詳細介紹了Android CountDownTimer實現(xiàn)定時器和倒計時效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-02-02Android自定義recyclerView實現(xiàn)時光軸效果
這篇文章主要介紹了Android自定義recyclerView實現(xiàn)時光軸效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-01-01Android實現(xiàn)偵聽電池狀態(tài)顯示、電量及充電動態(tài)顯示的方法
這篇文章主要介紹了Android實現(xiàn)偵聽電池狀態(tài)顯示、電量及充電動態(tài)顯示的方法,非常實用的功能,需要的朋友可以參考下2014-09-09Android開發(fā)之圖片壓縮實現(xiàn)方法分析
這篇文章主要介紹了Android開發(fā)之圖片壓縮實現(xiàn)方法,結合實例形式分析了Android圖片壓縮的原理、實現(xiàn)方法及相關操作注意事項,需要的朋友可以參考下2019-03-03Android 使用Glide加載網(wǎng)絡圖片等比例縮放的實現(xiàn)方法
這篇文章主要介紹了Android 使用Glide加載網(wǎng)絡圖片等比例縮放的實現(xiàn)方法,需要的朋友可以參考下2018-08-08Android中BroadcastReceiver實現(xiàn)短信關鍵字自動回復功能
實現(xiàn)手機短信監(jiān)聽的方式有兩種:一是通過ContentObserver觀察者實現(xiàn)監(jiān)聽,另一種就是通過廣播即BroadcastReceiver實現(xiàn)短信監(jiān)聽,文章中通過使用BroadcastReceiver實現(xiàn)有新短信的及時監(jiān)聽及包含設定的關鍵字時自動回復2018-06-06