安卓音頻相關(guān)MediaPlayer和SoundPool

相信大家在開發(fā)過程中,可能會有這些場景昙啄,點贊需要音效猎提,彈窗需要音效获三,那么怎么實現(xiàn)呢?可以通過MediaPlayer或SoundPool來實現(xiàn)锨苏。

  • MediaPlayer

  • SoundPool


  • MediaPlayer
    1)獲取實例
MediaPlayer mp = new Mediaplayer();
mp.setDataSource(R.raw.test);
或者
MediaPlayer mp = MediaPlayer.create(this, R.raw.test);

2)播放來源
1.自帶resource資源
MediaPlayer.create(this, R.raw.test);
2.SD卡或其他文件路徑下的媒體文件
mp.setDataSource("/sdcard/test.mp3");
3.網(wǎng)絡(luò)媒體文件
mp.setDataSource("http://www.citynorth.cn/music/confucius.mp3");

MediaPlayer的setDataSource一共四個方法
setDataSource (String path)
setDataSource (FileDescriptor fd)
setDataSource (Context context, Uri uri)
setDataSource (FileDescriptor fd, long offset, long length)

其中使用FileDescriptor時疙教,需要將文件放到與res文件夾平級的assets文件夾里,然后使用:
AssetFileDescriptor fileDescriptor = getAssets().openFd("rain.mp3");m_mediaPlayer.setDataSource(fileDescriptor.getFileDescriptor(),fileDescriptor.getStartOffset(), fileDescriptor.getLength());
來設(shè)置datasource
3)播放器控制方法
Android通過控制播放器狀態(tài)的方式來控制媒體文件的播放
prepare()和prepareAsync()提供同步和異步設(shè)置播放器進入prepare狀態(tài)蚓炬,需要注意的是松逊,如果MediaPlayer實例是由create方法創(chuàng)建的,那么第一次啟動播放前不需要再調(diào)用prepare()了肯夏,因為create方法里已經(jīng)調(diào)用過了经宏。
start()是真正啟動文件播放的方法
pause()和stop()比較簡單,起到暫停和停止播放的作用
**seekTop()可以讓播放器從指定的位置開始播放驯击,是個異步方法烁兰,真正定位完成會觸發(fā)OnSeekComplete.onSeekComplete()
release()可以釋放播放器占用的資源
reset()可以使播放器從Error狀態(tài)中恢復(fù)過來,重新回到Idle狀態(tài)
4)設(shè)置播放器的監(jiān)聽器
MediaPlayer提供了一些設(shè)置不同監(jiān)聽器的方法來更好地對播放器的工作狀態(tài)進行監(jiān)聽徊都,以期及時處理各種情況沪斟,如: setOnCompletionListener(MediaPlayer.OnCompletionListener listener)、setOnErrorListener(MediaPlayer.OnErrorListener listener)等,設(shè)置播放器時需要考慮到播放器可能出現(xiàn)的情況設(shè)置好監(jiān)聽和處理邏輯,以保持播放器的健壯性主之。

  • SoundPool
    可以用SoundPool播放一些短的反應(yīng)速度要求高的聲音择吊。MediaPlayer適合播放長的音頻。
    注意:1.SoundPool載入音樂使用獨立線程槽奕,不會阻塞UI主線程操作几睛。但是這里如果音效文件過大沒有載入完成,我們調(diào)用play方法時可能產(chǎn)生嚴重的后果粤攒,這里Android SDK提供了一個SoundPool.OnLoadCompleteListener類來幫助我們了解媒體文件是否載入完成所森,我們重載 onLoadComplete(SoundPool soundPool, int sampleId, int status) 方法即可獲得。
    2.SoundPool在load時可以處理多個媒體一次初始化并放入內(nèi)存中夯接,這里效率比MediaPlayer高了很多焕济。 3. SoundPool類支持同時播放多個音效,這對于游戲來說是十分必要的盔几,而MediaPlayer類是同步執(zhí)行的只能一個文件一個文件的播放晴弃。
    使用方法
    1.創(chuàng)建SoundPool實例
    public SoundPool(int maxStream, int streamType, int srcQuality)
    maxStream —— 同時播放的流的最大數(shù)量
    streamType —— 流的類型,一般為STREAM_MUSIC(具體在AudioManager類中列出)   srcQuality —— 采樣率轉(zhuǎn)化質(zhì)量问欠,當前無效果肝匆,使用0作為默認值
    eg. SoundPool soundPool = new SoundPool(3, AudioManager.STREAM_MUSIC, 0);   創(chuàng)建了一個最多支持3個流同時播放的,類型標記為音樂的SoundPool顺献。
    2 一般把多個聲音放到HashMap中去
soundPool = new SoundPool(4, AudioManager.STREAM_MUSIC, 100);
soundPoolMap = new HashMap<Integer, Integer>();
soundPoolMap.put(1, soundPool.load(this, R.raw.dingdong, 1));

soundpool的加載:

//從APK資源載入
int  load(Context context, int resId, int priority)
 //從FileDescriptor對象載入 
int  load(FileDescriptor fd, long offset, long length, int priority)
//從Asset對象載入
int  load(AssetFileDescriptor afd, int priority)  
 //從完整文件路徑名載入 最后一個參數(shù)為優(yōu)先級
int  load(String path, int priority)

播放
play(int soundID, float leftVolume, float rightVolume, int priority, int loop, float rate) leftVolume和rightVolume表示左右音量
priority表示優(yōu)先級
loop表示循環(huán)次數(shù)
rate表示速率,如 //速率最低0.5最高為2枯怖,1代表正常速度
sp.play(soundId, 1, 1, 0, 0, 1);
而停止則可以使用 pause(int streamID) 方法注整,這里的streamID和soundID均在構(gòu)造SoundPool類的第一個參數(shù)中指明了總數(shù)量,而id從0開始度硝。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末肿轨,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子蕊程,更是在濱河造成了極大的恐慌椒袍,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件藻茂,死亡現(xiàn)場離奇詭異驹暑,居然都是意外死亡,警方通過查閱死者的電腦和手機辨赐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進店門优俘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人掀序,你說我怎么就攤上這事帆焕。” “怎么了不恭?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵叶雹,是天一觀的道長财饥。 經(jīng)常有香客問我,道長折晦,這世上最難降的妖魔是什么佑力? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮筋遭,結(jié)果婚禮上打颤,老公的妹妹穿的比我還像新娘。我一直安慰自己漓滔,他們只是感情好编饺,可當我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著响驴,像睡著了一般透且。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上豁鲤,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天秽誊,我揣著相機與錄音,去河邊找鬼琳骡。 笑死锅论,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的楣号。 我是一名探鬼主播最易,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼炫狱!你這毒婦竟也來了藻懒?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤视译,失蹤者是張志新(化名)和其女友劉穎嬉荆,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體酷含,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡鄙早,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了第美。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蝶锋。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖什往,靈堂內(nèi)的尸體忽然破棺而出扳缕,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布躯舔,位于F島的核電站驴剔,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏粥庄。R本人自食惡果不足惜丧失,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望惜互。 院中可真熱鬧布讹,春花似錦、人聲如沸训堆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽坑鱼。三九已至膘流,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間鲁沥,已是汗流浹背呼股。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留画恰,地道東北人彭谁。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像阐枣,于是被迫代替她去往敵國和親马靠。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,033評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 安卓平臺和聲音錄制與播放相關(guān)的主要是4個類:MediaRecorder蔼两,MediaPlayer,SoundPool...
    閑庭閱讀 10,591評論 1 47
  • ¥開啟¥ 【iAPP實現(xiàn)進入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個線程逞度,因...
    小菜c閱讀 6,424評論 0 17
  • 本人初學(xué)Android额划,最近做了一個實現(xiàn)安卓簡單音樂播放功能的播放器,收獲不少档泽,于是便記錄下來自己的思路與知識總結(jié)...
    落日柳風閱讀 19,134評論 2 41
  • 一俊戳、使用VideoView播放視頻1、讀取放在raw目錄下的文件 2馆匿、//根據(jù)文件在SD卡中的路徑播放 二抑胎、使用M...
    濤濤123759閱讀 1,130評論 0 3
  • 15年的時候Echo同學(xué)挑戰(zhàn)金山嶺長城馬拉松通過42旅報名,我也第一次知道這家專門做跑步的公司渐北。巧得很阿逃,兩個多月后...
    白大炮閱讀 136評論 0 2