日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

android 音频播放总结 soundlPool,MediaPlay

發(fā)布時間:2023/12/18 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android 音频播放总结 soundlPool,MediaPlay 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

soundlPool 用于小音頻的播放多個同時播放。

使用步驟:

步驟一:

  首先下載音頻文件可以將其放入assets文件夾下或者res下的raw文件夾下,區(qū)別在于assets下可以再新建文件夾而raw不行,assets內(nèi)部單個文件超過1m時可能存在bug而raw不會。soundpool的音頻文件大小不能超過1M同時時間超過5-6秒可能會出錯。

步驟二:

  構(gòu)造實(shí)例

  SoundPool(int maxStreams, int streamType, int srcQuality) 參數(shù)依次是:

  • ①指定支持多少個聲音,SoundPool對象中允許同時存在的最大流的數(shù)量,該值太大就會報(bào)錯AudioFlinger could not ?create track, status: -12 ,就聽不到聲音
  • ②指定聲音類型,流類型可以分為STREAM_VOICE_CALL,?STREAM_SYSTEM,?STREAM_RING,STREAM_MUSIC?和STREAM_ALARM四種類型。在AudioManager中定義。
  •   ③指定聲音品質(zhì)(采樣率變換質(zhì)量),一般直接設(shè)置為0!

  在低版本中可以用上述構(gòu)造方法,而API 21(Android 5.0)后這個構(gòu)造方法就過時了! 而用到一個SoundPool.Builder的東東,我們要實(shí)例化SoundPool只需調(diào)用:

SoundPool.Builder spb = new SoundPool.Builder(); spb.setMaxStreams(10); spb.setAudioAttributes(null); //轉(zhuǎn)換音頻格式 SoundPool sp = spb.build(); //創(chuàng)建SoundPool對象

要使用上述代碼的話,TargetSDK版本要設(shè)置大于等于21哦!而且如果minSDK版本小于21 會出現(xiàn)下面的提醒:

?

步驟三:

  加載聲音資源文件

  • load(Context context, int resId, int priority)?//從APK資源載入
  • load(String path, int priority)
  • load(FileDescriptor fd, long offset, long length, int priority)
  • load(AssetFileDescriptor afd, int priority)

參數(shù)介紹

  • context:上下文
  • resId:資源id,如蔥raw文件獲取填寫R.raw.xxx
  • priority:沒什么用的一個參數(shù),建議設(shè)置為1,保持和未來的兼容性
  • path:文件路徑,文件的絕對路線,如存放在sd卡中的音頻
  • FileDescriptor:貌似是流吧,這個我也不知道 ?http://www.fengfly.com/plus/view-214059-1.html
  • AssetFileDescriptor:從asset目錄讀取某個資源文件,context.getAssets().openFd("xxx"),xxx表示文件名

上述方法都會返回一個聲音的ID,Integer類型,我們可以通過建立一個Map<Integer,Integer> 來存儲和獲取聲音方法如下,

Map<Integer,Integer> map=new HashMap<Integer, Integer>(); map.put(1,soundPool.load(context.getAssets().openFd("FadeOut.ogg"),1));

注意:

當(dāng)調(diào)用load方法的時候?qū)嶋H就是把音效加載到了 SoundPool中,此時返回的streamId其實(shí)就是該音效在SoundPool中的Id,這個ID0還是1來著(有點(diǎn)記不清了)增,不過要注意的是,不要超過 ?256 ?這個臨界點(diǎn)。也就是說第257個聲音加載進(jìn)去后,調(diào)用play方法其實(shí)是播不出來的,說不定還會擠掉一些前面加載好的聲音。這個256的限制通過查看SDK源碼基本就能了解清楚,它底層就那么實(shí)現(xiàn)的,用一個類似堆棧來存。

步驟四:

播放音頻文件

  play(int soundID, float leftVolume, float rightVolume, int priority, int loop, float rate),其返回值為一個int類型的數(shù)字

  參數(shù)依次是:

  • soundID:Load()返回的聲音ID號,以上可以通過map.get(1)獲取
  • leftVolume:左聲道音量設(shè)置 ?一般為0-1,默認(rèn)填1
  • rightVolume:右聲道音量設(shè)置?一般為0-1,默認(rèn)填1
  • priority:指定播放聲音的優(yōu)先級,數(shù)值越高,優(yōu)先級越大。默認(rèn)填0
  • loop:指定是否循環(huán):-1表示無限循環(huán),0表示不循環(huán),其他值表示要重復(fù)播放的次數(shù)
  • rate:指定播放速率:1.0的播放率可以使聲音按照其原始頻率,而2.0的播放速率,可以使聲音按照其 原始頻率的兩倍播放。如果為0.5的播放率,則播放速率是原始頻率的一半。播放速率的取值范圍是0.5至2.0。

  如果SoundPool剛調(diào)完加載load函數(shù)之后,直接調(diào)用SoundPool的play函數(shù)可能出現(xiàn)error "sample 1 not READY",所以建議,調(diào)用加載資源函數(shù)load之后,實(shí)現(xiàn)資源加載結(jié)束的監(jiān)聽函數(shù),在這個監(jiān)聽到資源加載結(jié)束之后,播放音頻文件。

soundPool.setOnLoadCompleteListener(new SoundPool.OnLoadCompleteListener() {@Overridepublic void onLoadComplete(SoundPool soundPool, int sampleId, int status) {soundPool.play(map.get(1),1,1,0,0,1);}});

?

步驟五:

去除音頻或者停止播放重置資源

soundPool.pause(int streamID)? 暫停指定播放流的音效
  • streamID:應(yīng)通過play()返回

soundPool.resume(int streamID)? 繼續(xù)播放指定播放流的音效

  • streamID:應(yīng)通過play()返回
soundPool.stop(int streamID) 終止指定播放流的音效
  • streamID:應(yīng)通過play()返回
soundPool.unload(int soundID) 卸載一個指定的音頻資源.
  • soundID:Load()返回的聲音ID號,以上可以通過map.get(1)獲取
soundPool.release(); 釋放SoundPool中的所有音頻資源.


注意,:
1.play()函數(shù)傳遞的是一個load()返回的soundID——指向一個被記載的音頻資源?,如果播放成功則返回一個非0的streamID——指向一個成功播放的流?;同一個soundID?可以通過多次調(diào)用play()而獲得多個不同的streamID?(只要不超出同時播放的最大數(shù)量);
2.pause()、resume()和stop()是針對播放流操作的,傳遞的是play()返回的streamID?;
3.play()中的priority參數(shù),只在同時播放的流的數(shù)量超過了預(yù)先設(shè)定的最大數(shù)量是起作用,管理器將自動終止優(yōu)先級低的播放流。如果存在多個同樣優(yōu)先級的流,再進(jìn)一步根據(jù)其創(chuàng)建事件來處理,新創(chuàng)建的流的年齡是最小的,將被終止;
4.無論如何,程序退出時,手動終止播放并釋放資源是必要的。
5.如果你音效多,也不要指望unload方法來清除掉一些音效后再load新的進(jìn)去,雖然unload后音效卸載了,但是前面分給它在SoundPool里面的Id可沒有釋放掉,也就是說這個時候你load新的進(jìn)去只會在后面繼續(xù)累加,然后累加多了就超過256了,然后就就聽不到聲音,然后就沒有然后了。要想徹底清掉前面的音效請使用release方法,它會連內(nèi)存中占用的資源一起釋放掉。
6.其他還有點(diǎn)什么呢,load需要一點(diǎn)點(diǎn)時間,load后不要馬上unload,load ---play--unload的做法并不可取,不要load太大的音效,它只會申請1M的內(nèi)存空間。SoundPool出錯后通常會看到retuen的值是0。

mediaPlay播放音頻文件。
使用步驟:
1.新建對象
MediaPlayer mp = new MediaPlayer();//使用這種方式獲取對象是因?yàn)槟闼シ诺囊纛l文件在sd卡或者是網(wǎng)絡(luò)音頻等,隨后需要添加(setDataSource)自己需要播放的音頻,使用這種方式新建的對象需要將播放器進(jìn)入prepare狀態(tài),下面會說。
MediaPlayer mp = MediaPlayer.create(this, R.raw.music);//使用這種方式直接將工程中的音頻播放,使用這種方式不用將播放器進(jìn)入prepare狀態(tài),因?yàn)樵赾reat時已經(jīng)自己做了這步操作。
2.添加需要播放的音頻文件
mediaplay播放的音頻主要來自于4個來源
1、res文件夾下的raw文件,添加方式如下
  MediaPlayer.create(this, R.raw.test);
2、src/main下的assets文件,添加方式如下
  AssetFileDescriptor fileDescriptor = getAssets().openFd("music.mp3");
  mediaPlayer.setDataSource(fileDescriptor.getFileDescriptor(),fileDescriptor.getStartOffset(), fileDescriptor.getLength());
3、網(wǎng)絡(luò)上的音頻文件
  mp.setDataSource("http://www.xxxxxxx/music.mp3");
4、本地sd卡下的文件
  mp.setDataSource("/sdcard/music.mp3");


3.控制播放器進(jìn)入prepare狀態(tài)
prepare()和prepareAsync() 提供了同步和異步兩種方式設(shè)置播放器進(jìn)入prepare狀態(tài),需要注意的是,如果MediaPlayer實(shí)例是由create方法創(chuàng)建的,那么第一次啟動播放前不需要再調(diào)用prepare()了,因?yàn)閏reate方法里已經(jīng)調(diào)用過了。
 start()
 pause()和stop()比較簡單,起到暫停和停止播放的作用
?seekTo()是定位方法,可以讓播放器從指定的位置開始播放,需要注意的是該方法是個異步方法,也就是說該方法返回時并不意味著定位完成,尤其是播放的網(wǎng)絡(luò)文件,真正定位完成時會觸發(fā)OnSeekComplete.onSeekComplete(),如果需要是可以調(diào)用setOnSeekCompleteListener(OnSeekCompleteListener)設(shè)置監(jiān)聽器來處理的。
 release()可以釋放播放器占用的資源,一旦確定不再使用播放器時應(yīng)當(dāng)盡早調(diào)用它釋放資源。
 reset()可以使播放器從Error狀態(tài)中恢復(fù)過來,重新會到Idle狀態(tài)。
 setLooping()設(shè)置循環(huán)播放
 setOnCompletionListener(MediaPlayer.OnCompletionListener listener)播放完成監(jiān)聽。
 setOnErrorListener(MediaPlayer.OnErrorListener listener)播放錯誤監(jiān)聽

轉(zhuǎn)載于:https://www.cnblogs.com/minyc/p/myc201607201527.html

總結(jié)

以上是生活随笔為你收集整理的android 音频播放总结 soundlPool,MediaPlay的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。