導航:首頁 > 操作系統 > android播放多個音頻

android播放多個音頻

發布時間:2022-11-19 01:37:31

android播放簡短音頻-SoulPool

前言

最近新接觸的項目中有一個業務功能是語音播報,所以有接觸到了SoulPool這個類,寫個文章記錄一下~

如果項目業務功能中需要播放簡短的音頻的話,可以使用SoundPool 。SoundPool 是 Android 提供的一個API類,用來播放簡短音頻的,使用起來簡單並且功能強大。

SoundPool 除了可以完成音頻的播放、暫停、恢復及停止的操作外,還可以調節左右聲道的音量值、調整播放的語速、設置播放的優先順序以及播放的次數等等。

創建SoulPool

SoundPool 的創建方式在Android 5.0 以前是直接使用SoundPool 的構建方法即可,在Android5.0之後,則是使用Builder模式來創建。為了更好的兼容性,我們可以判斷一下api版本進行對應的創建。

Android5.0之前SoundPool 的構造函數有三個參數分別是maxStreams、streamType和srcQuality。

maxStreams:同時播放流的最大數量,當播放的流大於此設置值時,則會選擇性停止優先順序較低的流;

streamType:流類型,例如STREAM_MUSIC、STREAM_ALARM、STREAM_NOTIFICATION等;

srcQuality:采樣率轉換器質量,很少用得上,默認設置0即可;

Android5.0 之後,使用Builder模式進行構造,可以設置多個參數。我這里放兩張源碼截圖,如果需要詳細了解的,可以自己點進去追蹤一下~

SoundPool.Builder中setMaxStreams和之前Android5.0SoundPool的構造函數maxStreams參數相同。SoundPool.Builder中setAudioAttributes用來設置audio 屬性,此值要麼不設,要麼設置不為null的值,否則會導致異常產生。

音頻資源的載入與播放

首先我們要進行音頻資源的載入,載入成功之後,才能進行播放。載入音頻,我們可以使用SoulPool實例中的load方法。

載入音頻資源時非同步執行的,此過程需要時間,所以我們可以使用SoulPool中的OnLoadCompleteListener介面進行監聽,其中的onLoadComplete方法則是在音頻資源載入完成後調用。

我們還可以通過SoulPool中的unload方法,卸載之前載入過的資源。

其實,只要我們點進去SoulPool類中,就能看見它提供的所有方法了,如上圖。

音頻播放,我們是使用到了SoulPool實例中的play方法,該方法要傳比較多的參數,分別是soundID、leftVolume、rightVolume、priority、loop和rate,它們分別代表的意思是:

soundID:是SoulPool載入資源load方法返回的值,指向某個已載入的音頻資源;

leftVolume和rightVolume:分別代表左聲道和右聲道的值,設置范圍在0f ~ 1f;

priority:則是流的優先順序;

loop:是循環播放的次數, 例如-1是表示無限循環;

rate:則是播放的速率 ,1是正常速率,如果設置2則表示2倍速率;

play方法返回的streamID,若返回0則播放失敗,其它值都代表播放成功。

圖中方法還有pause、resume、stop分別代表暫停音播放、恢復音頻播放和停止音頻播放。SoulPool提供的方法,源碼中都有,這里就不一一細說了。記得!一定要釋放資源(release)

注意事項

1.SoulPool並不是什麼格式的音頻資源都支持的,MP3這些常見的格式當然是支持的,如果有別的格式的音頻可以自己測試一下;

2.SoulPool是Android為了播放簡短音頻提供的api,所以盡量不要播放時間過長的音頻;

3.設置播放流的優先順序的問題,如果同時播放的活動流的數目超過設置的maxStreams時,會根據優先順序來停止優先順序較低的流;如果有多個具有相同低優先順序的流,它將選擇要停止的最舊流,並且該流不再有效;如果要播放的流的優先順序最低,則會播放失敗。

4.載入音頻資源的數量限制也注意一下,別載入過多。

                                2021年9月15日程序猿小鍾帶著【播放簡短音頻類-SoulPool】到此一游~

② Android音頻播放

最近需要在Android的客戶端中使用PCM聲音播放和錄制,簡單學習了一下。有不正確的地方還請指出。

首先有幾個概念需要了解一下:采樣頻率、聲道數、采樣位數。

采樣頻率一般是sample rate, 代表的是數字化音頻時每秒采樣的次數。常見的有44.1KHz(CD品質)、48KHz等。

這個很好理解,單聲道Mono就是聲音從一個方向傳出來;雙聲道Stereo也叫立體聲,聲音是從兩個方向傳來。通常的流行音樂中,仔細聽能發現每個聲道可能側重不同的樂曲聲部,比如左聲道吉他,右聲道鋼琴,人聲似乎兩個聲道都有,聽起來就像站在中間一樣。(這里沒有考證,隨便舉例)

每一個采樣都是一個數據點,采樣位數是指這個數據點使用了幾位來記錄。AudioTrack類只支持8位和16位的PCM音頻。8位就是2的8次方,即256個值;而16位則是2的16次方,有65536個值。

這個在音頻的編解碼中還是比較常用的。在PCM格式中,1秒鍾音頻的數據大小是SampleRate×Channel×Bit/8,單位是byte位元組。由於PCM本身沒有音頻幀的概念,所以通過這個公式就能計算出任意時長音頻的大小,或者得到任意大小音頻的時長。如果規定1個音頻幀是「每個聲道256個采樣」,雙聲道下就是512個采樣,那麼1幀的數據量就是256×Channel×Bit/8,同理可以推斷出1秒鍾有多少音頻幀等等。音頻幀的概念在各種編解碼中各有不同,但計算公式大同小異,這里不展開。

Android中音頻的播放使用的是AudioTrack類,具體用法非常簡單。
首先設置buffer大小。AudioTrack播放時需要先寫入buffer,如果這個buffer沒有寫滿,那麼這部分是不會播放的。所以buffer不能設置太小,這樣會導致播放不連貫;而buffer也不能設置太小,這樣不間斷寫入會消耗許多CPU資源。AudioTrack自帶了getMinBufferSize方法可以給出一個最小buffer,一般用這個值就可以。getMinBufferSize方法三個參數分別是sample rate、channel和bit。

設置完buffer size就可以實例化一個AudioTrack。其中第一個參數streamType是指不同的音頻流類型,包括STREAM_MUSIC、STREAM_ALARM、STREAM_VOICE_CALL、STREAM_RING等,是Android對不同音頻的分類。中間三個參數很好理解,第四個是buffer size,剛剛計算出來了。最後一個參數mode有兩種:MODE_STREAM和MODE_STATIC。前者是以流形式播放,後者則是一次性全部寫入然後播放。

調用實例的play()方法就可以開始播放了。不過播放得要有數據吧?要填寫數據就要用到write()方法。write方法中第一個參數是一個byte[]類型,是要寫入的數據源,可以是從文件流中讀取出來的;第二個參數offset是初始位移,即從source的哪個位置開始;第三個參數則是輸入長度。

當write方法寫滿一個AudioTrack的buffer時,就會有聲音播放出來了。
當播放完成後記得要把AudioTrack停止並釋放。

③ 安卓或蘋果 一個手機怎麼同時放多個音樂

安卓下載多個播放器就可以,蘋果不越獄不行的。
歡迎採納,謝謝

④ Android MediaPlayer同時播放多首歌曲

不考慮Midware和底層的實現, 在應用層這么搞是很容易失敗的, GPU CPU的執行效率這些都是考慮因素。
如果是硬體廠商沒有修改,理想情況下是可以播放多個,但是非移動終端一般情況下只允許播放一個,你們所說的mediaplayer 或者surfaceview 都是上層的抽象和繪制,移動終端一般的配置也最多能帶起3-5個播放,無論是內存還是硬體解碼都不可能會無限制的讓你去開n個播放

⑤ Android使用FFmpeg播放視頻(二):音頻播放

Android使用FFmpeg播放視頻(一):視頻播放
Android NDK開發:利用OpenSL ES實現聲音播放

這里我創建了兩個JNI函數,一個是播放的,一個是釋放的如下:

這里我在用於播放的JNI函數中依次初始化了FFmpeg和OpenSLES

其中初始化FFmpeg的函數中的邏輯其實和使用FFmpeg播放視頻畫面中的邏輯差不多,主要區別就是要找到音頻的索引以及後面對於解析音頻的一些配置;而初始化OpenSLES基本就和之前使用OpenSLES播放PCM數據是一樣的,具體如下:

最後再加入釋放資源的邏輯即可

這里的案例源碼是和之前播放視頻畫面的分開了
https://gitee.com/itfitness/ffmpeg-audio-demo

⑥ Android 中多個Mp3音頻文件合成

由於項目需求,需要將多個Mp3文件合並成一個Mp3文件,老項目中使用 FileChannel.transferFrom方法合並,直接導致生成的音頻文件無法正確獲取進度和時長,調研後選擇使用MediaExtractor方法,參考 https://juejin.im/post/5da80562f265da5bb5584a82 。

------------------------------------------------------------------------------------------分割線-------------------------------------------------------------------------------------------------------------------------
本來以為合成的功能已經實現,項目本地播放並沒有發現問題,但是把合成的文件放到其他播放器中播放時,問題出現了。文件播放到最後幾秒時,音頻總時長會莫名的自增,以及合成的文件總時長與多個音頻片段相加的時長有幾秒偏差。應該是音頻文件在流寫入時出了問題,有了解的大牛幫忙分析分析。最後放棄這個合並方案, 選擇了FFmpeg合並,解決了音頻合成問題 。合並命令如下:

⑦ 安卓手機,怎麼讓手機自帶音樂播放器支持多種音頻的播放

沒辦法。除非你把自帶替換成第三方。

⑧ android開發中多個音頻使用的問題

MediaPlayer有OnCompletionListener介面,每播放完一次就會回調這個介面。定義一個播放方法,把這些音頻放到一個列表裡,每調用這個方法一次,列表索引加1。這個播放方法在OnCompletionListener介面里調用即可依次播放。

⑨ android音視頻開發一安卓常用API

Android SDK 提供了兩套音頻採集的API,分別是:MediaRecorder 和 AudioRecord,前者是一個更加上層一點的API,它可以直接把手機麥克風錄入的音頻數據進行編碼壓縮(如AMR、MP3等)並存成文件,而後者則更接近底層,能夠更加自由靈活地控制,可以得到原始的一幀幀PCM音頻數據。如果想簡單地做一個錄音機,錄製成音頻文件,則推薦使用 MediaRecorder,而如果需要對音頻做進一步的演算法處理、或者採用第三方的編碼庫進行壓縮、以及網路傳輸等應用,則建議使用 AudioRecord,其實 MediaRecorder 底層也是調用了 AudioRecord 與 Android Framework 層的 AudioFlinger 進行交互的。直播中實時採集音頻自然是要用AudioRecord了。

2.1 播放聲音可以用MediaPlayer和AudioTrack,兩者都提供了Java API供應用開發者使用。雖然都可以播放聲音,但兩者還是有很大的區別的。

2.2 其中最大的區別是MediaPlayer可以播放多種格式的聲音文件,例如MP3,AAC,WAV,OGG,MIDI等。MediaPlayer會在framework層創建對應的音頻解碼器。而AudioTrack只能播放已經解碼的PCM流,如果對比支持的文件格式的話則是AudioTrack只支持wav格式的音頻文件,因為wav格式的音頻文件大部分都是PCM流。AudioTrack不創建解碼器,所以只能播放不需要解碼的wav文件。

2.3 MediaPlayer在framework層還是會創建AudioTrack,把解碼後的PCM數流傳遞給AudioTrack,AudioTrack再傳遞給AudioFlinger進行混音,然後才傳遞給硬體播放,所以是MediaPlayer包含了AudioTrack。

2.4 在接觸Android音頻播放API的時候,發現SoundPool也可以用於播放音頻。下面是三者的使用場景:MediaPlayer 更加適合在後台長時間播放本地音樂文件或者在線的流式資源; SoundPool 則適合播放比較短的音頻片段,比如游戲聲音、按鍵聲、鈴聲片段等等,它可以同時播放多個音頻; 而 AudioTrack 則更接近底層,提供了非常強大的控制能力,支持低延遲播放,適合流媒體和VoIP語音電話等場景。

使用 Camera API 採集視頻數據並保存到文件,分別使用 SurfaceView、TextureView 來預覽 Camera 數據,取到 NV21 的數據回調。

4.1 一個音視頻文件是由音頻和視頻組成的,我們可以通過MediaExtractor、MediaMuxer把音頻或視頻給單獨抽取出來,抽取出來的音頻和視頻能單獨播放; 

4.2 MediaMuxer的作用是生成音頻或視頻文件;還可以把音頻與視頻混合成一個音視頻文件。

文獻資料  https://www.cnblogs.com/renhui/p/7452572.html

⑩ 如何讓2個安卓手機同時播放一個音樂(完全的同步)如果能5個手機同時播放就更完美了

咨詢記錄 · 回答於2021-06-11

閱讀全文

與android播放多個音頻相關的資料

熱點內容
dvd光碟存儲漢子演算法 瀏覽:757
蘋果郵件無法連接伺服器地址 瀏覽:963
phpffmpeg轉碼 瀏覽:671
長沙好玩的解壓項目 瀏覽:145
專屬學情分析報告是什麼app 瀏覽:564
php工程部署 瀏覽:833
android全屏透明 瀏覽:737
阿里雲伺服器已開通怎麼辦 瀏覽:803
光遇為什麼登錄時伺服器已滿 瀏覽:302
PDF分析 瀏覽:485
h3c光纖全工半全工設置命令 瀏覽:143
公司法pdf下載 瀏覽:382
linuxmarkdown 瀏覽:350
華為手機怎麼多選文件夾 瀏覽:683
如何取消命令方塊指令 瀏覽:349
風翼app為什麼進不去了 瀏覽:778
im4java壓縮圖片 瀏覽:362
數據查詢網站源碼 瀏覽:150
伊克塞爾文檔怎麼進行加密 瀏覽:892
app轉賬是什麼 瀏覽:163