android 音頻播放總結 soundlPool,MediaPlay

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

使用步驟:

步驟一:

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

步驟二:

  構造實例

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

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

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

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

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

?

步驟三:

  加載聲音資源文件

  • 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)

參數介紹

  • context:上下文
  • resId:資源id,如蔥raw文件獲取填寫R.raw.xxx
  • priority:沒什么用的一個參數,建議設置為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));

注意:

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

步驟四:

播放音頻文件

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

  參數依次是:

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

  如果SoundPool剛調完加載load函數之后,直接調用SoundPool的play函數可能出現error "sample 1 not READY",所以建議,調用加載資源函數load之后,實現資源加載結束的監聽函數,在這個監聽到資源加載結束之后,播放音頻文件。

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:應通過play()返回

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

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


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

mediaPlay播放音頻文件。
使用步驟:
1.新建對象
MediaPlayer mp = new MediaPlayer();//使用這種方式獲取對象是因為你所播放的音頻文件在sd卡或者是網絡音頻等,隨后需要添加(setDataSource)自己需要播放的音頻,使用這種方式新建的對象需要將播放器進入prepare狀態,下面會說。
MediaPlayer mp = MediaPlayer.create(this, R.raw.music);//使用這種方式直接將工程中的音頻播放,使用這種方式不用將播放器進入prepare狀態,因為在creat時已經自己做了這步操作。
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、網絡上的音頻文件
  mp.setDataSource("http://www.xxxxxxx/music.mp3");
4、本地sd卡下的文件
  mp.setDataSource("/sdcard/music.mp3");


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

轉載于:https://www.cnblogs.com/minyc/p/myc201607201527.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/457563.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/457563.shtml
英文地址,請注明出處:http://en.pswp.cn/news/457563.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

文本分析軟件_十大針對機器學習的文本注釋工具與服務,你選哪個?

房地產和鍵【51CTO.com快譯】目前&#xff0c;從搜索引擎與情感分析&#xff0c;到虛擬助手與聊天機器人&#xff0c;機器學習應用場景中的許多研究領域&#xff0c;都需要通過文本注釋工具與服務來提供準確性。在AI研究與開發行業中&#xff0c;發現或創建可注釋的數據對于項目…

sqlite創建表

create table bike (id varchar(6) primary key, password char(6));

python 垃圾回收機制

DAY 18. python垃圾回收機制 python GC主要有三種方式 引用計數標記清除分代回收 其中&#xff0c;以引用計數為主。 18.1 引用計數&#xff08;Reference Counting&#xff09; 《尋夢環游記》中說&#xff0c;人一生會經歷兩次死亡&#xff0c;一次是肉體死的時候&#…

曲線連接線_荷重位移曲線儀操作使用注意事項-荷重位移曲線儀廠家

荷重位移曲線儀廣泛適用于各種按鍵及開關、DOME片、按鍵、微力彈片、硅膠按鍵、汽車開關之荷重-行程測定&#xff1b;Windows中英文雙語軟件&#xff0c;操作簡單方便&#xff0c;軟件流暢穩定&#xff0c;所有測試資料(測試條件&#xff0c;曲線&#xff0c;數據結果&#xff…

進程調度

1、策略 策略決定調度程序在何時讓什么進程運行。調度器的策略往往決定系統的整體印象&#xff0c;并且&#xff0c;還要負責優化使用處理器時間。 1.1 I/o消耗型和處理器消耗型。 進程可以被分為I/O消耗型和處理器消耗型。前者指進程的大部分時間用來提交I/O請求或者等待I/O請…

Django,Ajax,Vue實現文章評論功能

Django評論 評論復雜的地方在于需要實現點擊提交評論后評論內容需要立刻出現在下面&#xff0c;還要保持頁面位置不變&#xff0c;所以提交后不能整體刷新頁面&#xff0c;因為刷新以后頁面肯定在最上面&#xff0c;而評論一般都在最下面&#xff0c;所以要用到Ajax 整個過程用…

回歸分析什么時候取對數_冬蜜什么時候取,冬天取蜂蜜的方法

大家好&#xff0c;我現在分享的是&#xff0c;在冬天是在什么時候取蜜&#xff01;冬天在我們南方&#xff0c;取蜜時間是十一月到十二月的時候&#xff0c;只要溫度達到15度以上&#xff0c;蜂蜜封蓋了就可以取蜜了&#xff0c;并且在冬天我們只能取一次&#xff0c;最晚取蜜…

Opencv與dlib聯合進行人臉關鍵點檢測與識別

前言 依賴庫&#xff1a;opencv 2.4.9 /dlib 19.0/libfacedetection 本篇不記錄如何配置&#xff0c;重點在實現上。使用libfacedetection實現人臉區域檢測&#xff0c;聯合dlib標記人臉特征點&#xff0c;最后使用opencv的FaceRecognizer實現人臉識別。 準備工作 1、配置好Op…

Category 的一些事

來源&#xff1a;伯樂在線 - Tsui YuenHong 鏈接&#xff1a;http://ios.jobbole.com/90422/ 點擊 → 申請加入伯樂在線專欄作者 新增實踐部分&#xff1a;偏方 Hook 進某些方法來添加功能 Category – 簡介 Category&#xff08;類別&#xff09;是 Objective-C 2.0 添加的新特…

python tfidf特征變換_機器學習的“萬能模板” - 數據分析

最后是文本變量。很遺憾Titanic數據集中沒有合適的文本變量。一般我們處理文本變量的方法是&#xff0c;合并所有的文本形成一個變量&#xff0c;然后調用Count Vectorizer或者TfidfVectorizer算法&#xff0c;將文本數據轉換成數字。大部分情況下&#xff0c;TfidfVectorizer比…

python實現哈希表

# python 實現哈希表class HashTable:"""哈希函數的構造解決沖突"""def __init__(self, source):self.source sourceself._index []self._val []self.table []self._mod 13def Output(self):print(self._index)print(self._val)def _create…

商品綜合評價排名

店內有很多產品&#xff0c;而且包含但不局限于以下指標&#xff1a;瀏覽量、訪客數、平均停留時長、詳情頁跳出率、下單轉化率、下單支付轉化率、支付轉化率、下單金額、下單商品件數、下單買家數、支付金額、支付商品件數、加購件數、訪客平均價值、收藏人數、客單價、搜索支…

ionic資源網站

http://ionichina.com/topic/570b1f4ecd63e4247a7cfcf3 http://doc.ionicmaterialdesign.com/#intro http://ionicmaterial.com/demo/ 10大materialhttp://www.open-open.com/news/view/192f93e轉載于:https://www.cnblogs.com/znsongshu/p/6079357.html

pytorch神經網絡因素預測_實戰:使用PyTorch構建神經網絡進行房價預測

微信公號&#xff1a;ilulaoshi / 個人網站&#xff1a;lulaoshi.info本文將學習一下如何使用PyTorch創建一個前饋神經網絡(或者叫做多層感知機&#xff0c;Multiple-Layer Perceptron&#xff0c;MLP)&#xff0c;文中會使用PyTorch提供的自動求導功能&#xff0c;訓練一個神經…

SQL基本操作

SQL 操作 檢索數據 SELECT 檢索數據 -- 檢索單個列 SELECT 列名 FROM table_name;-- 檢索多個列 SELECT 列1, 列2 FROM table_name;-- 檢索所有列 SELECT * FROM table_name;-- 檢索不同的值 SELECT DISTINCT 列名 FROM table_name;限制檢索結果 -- SQL Server / Access SE…

git 忽略 部分文件夾_git提交忽略某些文件或文件夾

記得第一次用 github 提交代碼&#xff0c;node_modules 目錄死活傳不上去&#xff0c;哈哈哈&#xff0c;后來才知道在 .gitignore 文件里設置了忽略 node_modules 目錄上傳。是的&#xff0c; .gitignore 文件就是設置那些你不想用 git 一起上傳的文件和文件夾。比如剛接觸到…

Ajax實現原理詳解

Ajax&#xff1a;Asynchronous javascript and xml&#xff0c;實現了客戶端與服務器進行數據交流過程。使用技術的好處是&#xff1a;不用頁面刷新&#xff0c;并且在等待頁面傳輸數據的同時可以進行其他操作。 這就是異步調用的很好體現。首先得了解什么是異步和同步的概念。…

SpringJDBC解析3-回調函數(update為例)

PreparedStatementCallback作為一個接口&#xff0c;其中只有一個函數doInPrepatedStatement&#xff0c;這個函數是用于調用通用方法execute的時候無法處理的一些個性化處理方法&#xff0c;在update中的函數實現&#xff1a; protected int update(final PreparedStatementCr…

python上下文管理器

DAY 23. python上下文管理器 Python 的 with 語句支持通過上下文管理器所定義的運行時上下文這一概念。 此對象的實現使用了一對專門方法&#xff0c;允許用戶自定義類來定義運行時上下文&#xff0c;在語句體被執行前進入該上下文&#xff0c;并在語句執行完畢時退出該上下文&…

勾股定理python思路_趣叮咚編程數學揭秘:為什么勾股定理a+b=c?

我們都知道&#xff1a;三角形3個外角之和360度可是誰知道為什么等于360度呢&#xff1f;其實利用編程制作動圖演繹了解啦&#xff1a;那勾股定理abc又是為什么呢&#xff1f;還有很多有趣的數學公式都可以演繹&#xff1a;圓的面積公式、圓周長...通過動圖演繹原來晦澀難懂的定…