前言
MediaPlayer和AudioTrack都可以應(yīng)用在android系統(tǒng)中音頻的播放,兩者都提供API給開發(fā)者自定義播放音頻文件,功能相似,但是兩者還是區(qū)別很大裆站。首先MediaPlayer是活躍在framework層并提供的音頻解碼器,支持多種文件格式(例如:MP3黔夭、WAV宏胯、AAC等等主流音頻文件)。而AudioTrack則只支持PCM流(將話音本姥、圖像等模擬信號每隔一定時間進行取樣肩袍,使其離散化),因為目前比較多的WAV音頻文件大部分是一件解碼的PCM流婚惫,所以AudioTrack目前直接支持WAV音頻文件
為什么說僅支持氛赐?這里要說到MediaPlayer和AudioTrack之間的聯(lián)系魂爪,MediaPlayer在framework層也實例化了AudioTrack,其實質(zhì)是MediaPlayer在framework層進行解碼后艰管,生成PCM流滓侍,然后代理委托給AudioTrack,最后AudioTrack傳遞給AudioFlinger進行混音牲芋,然后才傳遞給硬件播放粗井。
比較常見使用AudioTrack,CPU占用率低街图,內(nèi)存消耗也比較少。因此如果是播放比較短時間的WAV音頻文件懒构,還是比較建議使用AudioTrack餐济。如果擴展性比較高,當然就是推薦MediaPlayer胆剧。
下面舉例MediaPlayer和AudioTrack一些使用例子:
MediaPlayer
MediaPlayer mMediaPlayer = new MediaPlayer(); // 創(chuàng)建MediaPlayer實例
mMediaPlayer.setDataSource(dataSource); // 設(shè)置播放資源絮姆,可以是asset、sd卡路徑秩霍,也可以是網(wǎng)絡(luò)url
mMediaPlayer.setLooping(false); // 不循環(huán)播放
mMediaPlayer.prepare(); // 播放前準備篙悯,需要調(diào)用,create創(chuàng)建實例可以不用調(diào)用
mMediaPlayer.start(); // 進行播放
mMediaPlayer.stop(); // 停止播放
mMediaPlayer.pause(); // 暫停播放
mMediaPlayer.release(); // 釋放播放資源
mMediaPlayer.reset(); // 重置播放器狀態(tài)
mMediaPlayer.seekTo(); // 調(diào)整進度
AudioTrack
// 初始化
AudioTrack mAudioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, // 指定在流的類型
// STREAM_ALARM:警告聲
// STREAM_MUSCI:音樂聲铃绒,例如music等
// STREAM_RING:鈴聲
// STREAM_SYSTEM:系統(tǒng)聲音
// STREAM_VOCIE_CALL:電話聲音
samplerate,// 設(shè)置音頻數(shù)據(jù)的采樣率
AudioFormat.CHANNEL_CONFIGURATION_STEREO,// 設(shè)置輸出聲道為雙聲道立體聲
AudioFormat.ENCODING_PCM_16BIT,// 設(shè)置音頻數(shù)據(jù)塊是8位還是16位
mAudioMinBufSize, AudioTrack.MODE_STREAM);// 設(shè)置模式類型鸽照,在這里設(shè)置為流類型
// AudioTrack中有MODE_STATIC和MODE_STREAM兩種分類。
// STREAM方式表示由用戶通過write方式把數(shù)據(jù)一次一次得寫到audiotrack中颠悬。
// 這種方式的缺點就是JAVA層和Native層不斷地交換數(shù)據(jù)矮燎,效率損失較大。
// 而STATIC方式表示是一開始創(chuàng)建的時候赔癌,就把音頻數(shù)據(jù)放到一個固定的buffer诞外,然后直接傳給audiotrack,
// 后續(xù)就不用一次次得write了灾票。AudioTrack會自己播放這個buffer中的數(shù)據(jù)峡谊。
// 這種方法對于鈴聲等體積較小的文件比較合適。
mAudioTrack.play(); // 啟動
mAudioTrack.write();//數(shù)據(jù)寫入audiotrack中
// 停止與釋放資源
mAudioTrack.stop();
mAudioTrack.release();