亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

android使用SoundPool播放音效的方法

 更新時間:2017年11月28日 09:17:31   作者:蛋蛋松  
本篇文章主要介紹了android使用SoundPool播放音效的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

在Android開發(fā)中我們經(jīng)常使用MediaPlayer來播放音頻文件,但是MediaPlayer存在一些不足,例如:資源占用量較高、延遲時間較長、不支持多個音頻同時播放等。這些缺點決定了MediaPlayer在某些場合的使用情況不會很理想,例如在對時間精準度要求相對較高的游戲開發(fā)中。

在游戲開發(fā)中我們經(jīng)常需要播放一些游戲音效(比如:子彈爆炸,物體撞擊等),這些音效的共同特點是短促、密集、延遲程度小。在這樣的場景下,我們可以使用SoundPool代替MediaPlayer來播放這些音效。

SoundPool(android.media.SoundPool),顧名思義是聲音池的意思,主要用于播放一些較短的聲音片段,支持從程序的資源或文件系統(tǒng)加載。與MediaPlayer相比,SoundPool的優(yōu)勢在于CPU資源占用量低和反應(yīng)延遲小。另外,SoundPool還支持自行設(shè)置聲音的品質(zhì)、音量、播放比率等參數(shù),支持通過ID對多個音頻流進行管理。

就現(xiàn)在已知的資料來說,SoundPool有一些設(shè)計上的BUG,從固件版本1.0開始有些還沒有修復(fù),我們在使用中應(yīng)該小心再小心。相信將來Google會修復(fù)這些問題,但我們最好還是列出來:

  1. SoundPool最大只能申請1M的內(nèi)存空間,這就意味著我們只能用一些很短的聲音片段,而不是用它來播放歌曲或者做游戲背景音樂。

  2. SoundPool提供了pause和stop方法,但這些方法建議最好不要輕易使用,因為有些時候它們可能會使你的程序莫名其妙的終止。建議使用這兩個方法的時候盡可能多做測試工作,還有些朋友反映它們不會立即中止播放聲音,而是把緩沖區(qū)里的數(shù)據(jù)播放完才會停下來,也許會多播放一秒鐘。

  3. SoundPool的效率問題。其實SoundPool的效率在這些播放類中算是很好的了,但是有的朋友在G1中測試它還是有100ms左右的延遲,這可能會影響用戶體驗。也許這不能管SoundPool本身,因為到了性能比較好的Droid中這個延遲就可以讓人接受了。

在現(xiàn)階段SoundPool有這些缺陷,但也有著它不可替代的優(yōu)點,基于這些我們建議大在如下情況中多使用SoundPool:1.應(yīng)用程序中的聲效(按鍵提示音,消息等)2.游戲中密集而短暫的聲音(如多個飛船同時爆炸)

1.相關(guān)方法介紹:

1)構(gòu)造方法:

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

①指定支持多少個聲音,SoundPool對象中允許同時存在的最大流的數(shù)量。

②指定聲音類型,流類型可以分為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的東東,我們要實例化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)下面的提醒:


2)常用方法介紹:

①加載聲音資源:

  1. load(Context context, int resId, int priority)
  2. load(String path, int priority)
  3. load(FileDescriptor fd, long offset, long length, int priority)
  4. load(AssetFileDescriptor afd, int priority) 上述方法都會返回一個聲音的ID,后面我們可以通過這個ID來播放指定的聲音

參數(shù)介紹:

  1. context:上下文
  2. resId:資源id
  3. priority:沒什么用的一個參數(shù),建議設(shè)置為1,保持和未來的兼容性
  4. path:文件路徑
  5. FileDescriptor:貌似是流吧,這個我也不知道
  6. AssetFileDescriptor:從asset目錄讀取某個資源文件,用法:
AssetFileDescriptor descriptor = assetManager.openFd("biaobiao.mp3");

②播放控制:

play(int soundID, float leftVolume, float rightVolume, int priority, int loop, float rate)

參數(shù)依次是:

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

③資源釋放:

可以調(diào)用release()方法釋放所有SoundPool對象占據(jù)的內(nèi)存和資源,當然也可以根據(jù)聲音 ID來釋放!

3.使用代碼示例:

運行效果圖:


當點擊按鈕的時候會,"Duang"一下,這里演示了兩種load的方法,分別是raw和assests!

關(guān)鍵代碼:

MainActivity.java:

private void initSP() throws Exception{
    //設(shè)置最多可容納5個音頻流,音頻的品質(zhì)為5
    mSoundPool = new SoundPool(5, AudioManager.STREAM_SYSTEM, 5);
    soundID.put(1, mSoundPool.load(this, R.raw.duang, 1));
    soundID.put(2 , mSoundPool.load(getAssets().openFd("biaobiao.mp3") , 1)); //需要捕獲IO異常
    soundID.put(3, mSoundPool.load(this, R.raw.duang, 1));
    soundID.put(4, mSoundPool.load(this, R.raw.duang, 1));
    soundID.put(5, mSoundPool.load(this, R.raw.duang, 1));
  }

  @Override
  public void onClick(View v) {
    switch (v.getId()){
      case R.id.btn_play1:
        mSoundPool.play(soundID.get(1), 1, 1, 0, 0, 1);
        break;
      case R.id.btn_play2:
        mSoundPool.play(soundID.get(2), 1, 1, 0, 0, 1);
        break;
      case R.id.btn_play3:
        mSoundPool.play(soundID.get(3), 1, 1, 0, 0, 1);
        break;
      case R.id.btn_play4:
        mSoundPool.play(soundID.get(4), 1, 1, 0, 0, 1);
        break;
      case R.id.btn_play5:
        mSoundPool.play(soundID.get(5), 1, 1, 0, 0, 1);
        break;
      case R.id.btn_release:
        mSoundPool.release();  //回收SoundPool資源
        break;
    }

代碼非常簡單,另外如果你點擊了最后一個按鈕的話,SoundPool就會被釋放,然后再其他按鈕 就不會Duang了哦~

4.OnLoadCompleteListener監(jiān)聽聲音文件是否加載完畢

嗯,這個是臨時想起的,寫完在寫另一篇的時候突然想起,用法也很簡單,我們可以 往上面的代碼中添加OnLoadCompleteListener這個東東,然后重寫onLoadComplete()方法 ,最后為SoundPool對象設(shè)置這個東東即可!

mSoundPool.setOnLoadCompleteListener(new SoundPool.OnLoadCompleteListener() {
  @Override
  public void onLoadComplete(SoundPool soundPool, int sampleId, int status) {
    Toast.makeText(MainActivity.this,"加特技準備完畢~",Toast.LENGTH_SHORT).show();
  }
});

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Android高級開發(fā)之性能優(yōu)化典范

    Android高級開發(fā)之性能優(yōu)化典范

    本文從電量,視圖,內(nèi)存三個性能方面的知識點給大家介紹android高級開發(fā)之性能優(yōu)化的相關(guān)知識,希望對大家有所幫助
    2016-05-05
  • Android與Vue的交互的方法示例

    Android與Vue的交互的方法示例

    這篇文章主要介紹了Android與Vue的交互的方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-05-05
  • Android 點擊生成二維碼功能實現(xiàn)代碼

    Android 點擊生成二維碼功能實現(xiàn)代碼

    二維碼,我們也稱作QRCode,QR表示quick response即快速響應(yīng),在很多App中我們都能見到二維碼的身影,最常見的莫過于微信了。接下來給大家介紹android 點擊生成二維碼功能實現(xiàn)代碼,需要的朋友參考下吧
    2017-11-11
  • 詳解Kotlin協(xié)程的異常處理機制

    詳解Kotlin協(xié)程的異常處理機制

    協(xié)程會遇到各種異常情況,比如協(xié)程被取消、協(xié)程內(nèi)部發(fā)生錯誤、協(xié)程之間的異常傳播等,這些異常情況需要我們正確地處理,否則可能會導(dǎo)致程序崩潰、資源泄露或者邏輯錯誤,本文將介紹 Kotlin 協(xié)程的異常處理機制,需要的朋友可以參考下
    2023-09-09
  • APK包名修改 請問如何修改APK包名

    APK包名修改 請問如何修改APK包名

    今天,想在android手機上安裝兩個相同的應(yīng)用,本以為可以安裝不同版本的,試了幾次,均相互覆蓋了,于是,只能設(shè)法修改apk所對應(yīng)的包名(package name),需要了解的朋友可以參考下
    2012-12-12
  • Android開發(fā)實現(xiàn)長按返回鍵彈出關(guān)機框功能

    Android開發(fā)實現(xiàn)長按返回鍵彈出關(guān)機框功能

    這篇文章主要介紹了Android開發(fā)實現(xiàn)長按返回鍵彈出關(guān)機框功能,涉及Android針對長按事件的響應(yīng)與處理相關(guān)操作技巧,需要的朋友可以參考下
    2017-09-09
  • SafeList?in?Flutter?and?Dart小技巧

    SafeList?in?Flutter?and?Dart小技巧

    這篇文章主要為大家介紹了SafeList?in?Flutter?and?Dart小技巧,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12
  • Android getSystemService用法實例總結(jié)

    Android getSystemService用法實例總結(jié)

    這篇文章主要介紹了Android getSystemService用法,結(jié)合實例形式總結(jié)分析了getSystemService獲取系統(tǒng)Service的相關(guān)使用方法與注意事項,需要的朋友可以參考下
    2016-01-01
  • Android實現(xiàn)雙層ViewPager嵌套

    Android實現(xiàn)雙層ViewPager嵌套

    這篇文章主要介紹了Android實現(xiàn)雙層ViewPager嵌套,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-04-04
  • 最好用的Android省市區(qū)三級聯(lián)動選擇效果

    最好用的Android省市區(qū)三級聯(lián)動選擇效果

    這篇文章主要為大家詳細介紹了最好用的Android省市區(qū)三級聯(lián)動選擇效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-02-02

最新評論