Android智能手機中各種音頻場景下的audio data path


上一篇文章(Android智能手機上的音頻淺析)說本篇將詳細講解Android智能手機中各種音頻場景下的音頻數據流向,現在我們就開始。智能手機中音頻的主要場景有音頻播放、音頻錄制、語音通信等。不同場景下的音頻數據流向有很大差異,即使是同一場景,在不同的模式下音頻數據流向也有所不同。

 

1,音頻播放

Android系統audio框架中主要有三種播放模式:low latency playback、deep buffer playback和compressed offload playback。

a)low latency playback:用於按鍵音、游戲背景音等對時延要求高的聲音輸出。音頻文件是在AP側解碼成PCM數據,然后再經由Audio DSP送給codec芯片播放出來。

b)deep buffer playback:用於音樂等對時延要求不高的聲音輸出。音頻文件是在AP側解碼成PCM數據,如果有音效的話會再對PCM數據處理(android audio framework中有effect音效模塊,支持的音效有均衡器、低音增強、環繞聲等),然后再經由Audio DSP送給codec芯片播放出來。

c)compressed offload playback:用於音樂等聲音輸出,但是音頻解碼部分的工作是在Audio DSP中完成,AP側只負責把音頻碼流送到Audo DSP中,送出去后AP側會進行休眠,Audo DSP中會分配一塊較大的buffer去處理此數據,在Audo DSP中進行解碼、音效的處理等工作,在Audo DSP解碼器處理完數據之前,它會喚醒AP側去送下一包數據。用這種模式播放音頻能有效的降低功耗,是最為推薦的播放音樂的模式。但是在目前的主流的音樂播放APP中用的基本上都是deep buffer的播放模式,比如QQ音樂、網易雲音樂和酷狗音樂等。看來系統平台廠商和APP廠商的做法是有差異的。至於哪些格式的音樂用這種模式播放,這需要在audioPolicy中去控制,我做的平台上是MP3(*.mp3)和AAC(*.m4a)用offload模式播放,因為這兩種格式最主流。

 

綜上low latency 模式和deep buffer模式都是在AP側解碼完后送PCM數據給Audio DSP,故音頻數據流向類似,我將放在一起講,而compressed offload模式是碼流送給Audio DSP解碼。播放系統音和游戲音用low latency 模式,播放音樂用deep buffer或者compressed offload模式,播放錄音用deep buffer模式。接下來我們看看low latency /deep buffer和compressed offload兩種模式下的音頻數據流向。在音頻播放時音頻數據只經過AP和audio DSP。

 

1)low latency / deep buffer模式下的音頻數據流向

從上圖看出,音頻文件先在AP上軟解碼得到PCM后經過AudioTrack/audioFlinger中的Mixer thread(有可能要做音效后處理)/audio HAL/tinyALSA后送給kernel,然后用IPC將PCM送給Audio DSP經重采樣混音等后播放出來。由於在AP上已做解碼和音效后處理,Audio DSP上就不需要做了。

 

2)compressed offload模式下的音頻數據流向

從上圖看出,音頻碼流經過AP上的AudioTrack/audioFlinger中的Offload thread(不需要做音效后處理)/audio HAL/tinyALSA后送給kernel,然后用IPC將碼流送給Audio DSP經解碼、后處理、重采樣、混音等后播放出來。

 

2,音頻錄制

很多人喜歡把參加的重要會議或者演講的音頻錄下來,以便重復聽或者他用。下圖就是錄音時音頻數據的流向。同音頻播放一樣,錄音時音頻數據也是只經過AP和audio DSP。

從上圖看出,codec芯片采集到的PCM數據送給Audio DSP經重采樣、前處理后送給AP的kernel,再經由tinyALSA/audio HAL /audioFlinger中的Record thread/audioRecord等后做軟編碼得到錄音碼流文件並保持起來。

 

3,語音通信

語音通信就是打電話啦。它同音頻播放或者錄制不一樣,它是雙向的,分上行(uplink,把采集到的語音發送給對方)和下行(downlink,把收到的語音播放出來),而音頻播放或者錄制是單向的。它音頻數據流向也跟音頻播放或者錄制不一樣,只經過audio DSP和CP,下圖就是打電話時音頻數據的流向。

從上圖看出,在上行方向上codec芯片采集到的PCM數據送給Audio DSP經重采樣、前處理(AEC/ANS/AGC等)、編碼后得到碼流,並將碼流送給CP,CP處理后經過空口(air interface)送給對方。在下行方向上先從空口收對方送過來的語音數據,並做網絡側處理(jitter buffer等),然后送給Audio DSP,Audio DSP收到后做解碼、后處理(ANS/AGC等)、重采樣等,再把PCM數據經DMA/I2S送給codec芯片播放出來。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM