當前位置:首頁 » 安卓系統 » android語音播放

android語音播放

發布時間: 2024-01-07 06:45:39

Ⅰ 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音視頻【十二】使用OpenSLES和AudioTrack進行播放PCM

本節我們學習下如何播放pcm數據,在Android中有兩種方法:一種是使用java層的 AudioTrack 方法,一種是使用底層的 OpenSLES 直接在 jni 層調用系統的 OpenSLES的c方法 實現。

兩種使用場景不一樣:
AudioTrack 一般用於 比如本地播放一個pcm文件/流,又或者播放解碼後的音頻的pcm流,API較簡單。
OpenSLES 一般用於一些播放器中開發中,比如音頻/視頻播放器,聲音/音頻的播放採用的OpenSLES,一是播放器一般是c/c++實現,便於直接在c層調用OpenSLES的API,二也是如果用AudioTrack進行播放,務必會帶來java和jni層的反射調用的開銷,API較復雜。

可以根據業務自行決定來進行選擇。

AudioTrack的方式使用較簡單,直接在java層。

指定采樣率,采樣位數,聲道數進行創建。

其中44100是采樣率, AudioFormat.CHANNEL_OUT_STEREO 為雙聲道,還有 CHANNEL_OUT_MONO 單聲道。 AudioFormat.ENCODING_PCM_16BIT 為采樣位數16位,還有 ENCODING_PCM_8BIT 8位。 minBufferSize 是播放器緩沖的大小,也是根據采樣率和采樣位數,聲道數 進行獲取,只有滿足最小的buffer才去操作底層進程播放。

最後一個參數mode。可以指定的值有 AudioTrack.MODE_STREAM 和 AudioTrack.MODE_STATIC 。

MODE_STREAM 適用於大多數的場景,比如動態的處理audio buffer,或者播放很長的音頻文件,它是將audio buffers從java層傳遞到native層。音頻播放時音頻數據從Java流式傳輸到native層的創建模式。

MODE_STATIC 適用場景,比如播放很短的音頻,它是一次性將全部的音頻資源從java傳遞到native層。音頻數據在音頻開始播放前僅從Java傳輸到native層的創建模式。

是的,就這么一個方法。注意此方法是同步方法,是個耗時方法,一般是開啟一個線程循環調用 write 方法進行寫入。
注意在調用 write 方法前需要調用 audioTrack.play() 方法開始播放。

因為是pcm裸數據,無法像mediaplayer一樣提供了API。所以需要自己處理下。可以利用 getPlaybackHeadPosition 方法。

getPlaybackHeadPosition() 的意思是返回以幀為單位表示的播放頭位置
getPlaybackRate() 的意思是返回以Hz為單位返回當前播放采樣率。

所以當前播放時間可以通過如下方式獲取

OpenSLES:(Open Sound Library for Embedded Systems).
OpenSLES是跨平台是針對嵌入式系統精心優化的硬體音頻加速API。使用OpenSLES進行音頻播放的好處是可以不依賴第三方。比如一些音頻或者視頻播放器中都是用OpenSLES進行播放解碼後的pcm的,這樣免去了和java層的交互。

在Android中使用OpenSLES首先需要把Android 系統提供的so鏈接到外面自己的so。在CMakeLists.txt腳本中添加鏈接庫OpenSLES。庫的名字可以在 類似如下目錄中

需要去掉lib

然後導入頭文件即可使用了OpenSLES提供的底層方法了。

創建&使用的步驟大致分為:

一個 SLObjectItf 裡面可能包含了多個Interface,獲取Interface通過 GetInterface 方法,而 GetInterface 方法的地2個參數 SLInterfaceID 參數來指定到的需要獲取Object裡面的那個Interface。比如通過指定 SL_IID_ENGINE 的類型來獲取 SLEngineItf 。我們可以通過 SLEngineItf 去創建各種Object,例如播放器、錄音器、混音器的Object,然後在用這些Object去獲取各種Interface去實現各種功能。

如上所說,SLEngineItf可以創建混音器的Object。

在創建播放器前需要創建音頻的配置信息(比如采樣率,聲道數,每個采樣的位數等)

開始播放後會不斷的回調這個 pcmBufferCallBack 函數將音頻數據壓入隊列
(*pcmBufferQueue)->RegisterCallback(pcmBufferQueue, pcmBufferCallBack, this);

如果想要暫停播放參數直接設置為SL_PLAYSTATE_PAUSED,若暫停後繼續播放設置參數為SL_PLAYSTATE_PLAYING即可。若想要停止播放參數設置為SL_PLAYSTATE_STOPPED即可。

首先獲取播放器的用於控制音量的介面SLVolumeItf pcmVolumePlay

然後動態設置

首先也是獲取播放器的用於控制音量的介面SLMuteSoloItf pcmMutePlay

然後動態設置

看起來控制還是蠻簡單的哈。先熟悉這么多,OpenSLES還是蠻強大的。

https://github.com/ta893115871/PCMPlay

Ⅲ android 實現實時語音功能選擇接入哪個音視頻sdk好

可以考慮接入即構科技的音視頻sdk,他們的音視頻sdk平台兼容性強,可覆蓋 iOS、Android、Windows、macOS、Web、小程序並支持平台間互通,支持 32 路實時音視頻互動,能夠為開發者提供便捷接入、高清流暢、低延遲、高並發的音視頻服務,而且4 行代碼極速接入, 30 分鍾內即可構建完畢。

熱點內容
編程主機電腦 發布:2024-11-29 00:43:51 瀏覽:983
oc訪問成員變數嗎 發布:2024-11-29 00:14:59 瀏覽:517
七牛雲伺服器生成縮略圖 發布:2024-11-29 00:12:36 瀏覽:272
如何重設華為賬號密碼 發布:2024-11-29 00:03:33 瀏覽:813
安卓聽小說下載到哪個文件夾 發布:2024-11-29 00:03:01 瀏覽:932
閑魚掛腳本 發布:2024-11-29 00:01:27 瀏覽:630
ae加快緩存 發布:2024-11-28 23:50:34 瀏覽:342
java的版本號 發布:2024-11-28 23:48:18 瀏覽:100
sql存儲過程區別 發布:2024-11-28 23:35:37 瀏覽:919
ms計算機需要什麼配置 發布:2024-11-28 23:34:21 瀏覽:975