亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

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

Android中AudioTrack如何使用

發布時間:2021-07-12 11:37:53 來源:億速云 閱讀:146 作者:Leah 欄目:移動開發

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

1、Android AudioTrack簡介

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

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

如果是實時的音頻數據,那么只能用AudioTrack進行播放。

2、如何使用AudioTrack進行音頻播放

//根據采樣率,采樣精度,單雙聲道來得到frame的大小。  
int bufsize = AudioTrack.getMinBufferSize(8000,//每秒8K個點  
  AudioFormat.CHANNEL_CONFIGURATION_STEREO,//雙聲道 
  AudioFormat.ENCODING_PCM_16BIT);//一個采樣點16比特-2個字節 
 
//注意,按照數字音頻的知識,這個算出來的是一秒鐘buffer的大小。 
//創建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中寫數據 
 
…. 
 
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);將音頻數據進行播放。

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

扎囊县| 静安区| 灵宝市| 武邑县| 凉城县| 岳阳市| 澜沧| 肃北| 弥勒县| 齐齐哈尔市| 宜兰市| 岢岚县| 连南| 加查县| 南木林县| 榆林市| 定陶县| 兴化市| 广西| 平邑县| 克拉玛依市| 兴业县| 平原县| 汉沽区| 珠海市| 隆尧县| 章丘市| 当雄县| 翼城县| 洛宁县| 达州市| 新疆| 嘉义县| 喀喇沁旗| 弥勒县| 顺义区| 通榆县| 岳池县| 蒙山县| 广州市| 利津县|