1. 程式人生 > >嵌入式音頻軟件的架構

嵌入式音頻軟件的架構

lin 下載 src 嵌入式產品 模擬 本地 分享 apple 編碼

原創,如轉載請註明出處。謝謝!

嵌入式產品中語音通信和音樂播放的軟件架構是有差別的,這裏還是把這兩種case分開來講。

1, 語音通信
語音通信的軟件架構通常如下:

技術分享

語音發送時由codec芯片采集到語音的模擬信號轉換成PCM數據然後通過I2S總線發送給CPU(這是音頻驅動負責的,不同的OS會有不同的驅動架構,會在後面音頻采集和播放中詳細講,重點講linux的)。CPU收到PCM數據後首先做前處理,主要包括回音消除(AEC)/噪聲抑制(ANS)/自動增益控制(AGC)/VAD等,然後把PCM數據根據指定的codec編碼成碼流,再打上RTP包頭,根據需要還有可能做FEC/重傳語音的RTP包等以補償網絡的丟包。最後把生成的RTP包通過UDP socket發到網絡中。

語音接收時首先通過UDP socket收RTP包,根據指定看是否需要做FEC等,然後把RTP包或者RTP包的payload(不同的方案有不同的做法)放進jitter buffer中等待取走。
從jitter buffer取時取走的是payload,也就是碼流。然後對碼流解碼得到PCM數據,還要看是否需要做PLC/CNG等。最後把PCM數據通過I2S總線送給codec芯片再轉換成模擬信號播放出來。這樣雙方就可以通話了。

2,音樂播放
音樂播放分播放本地音樂和播放雲端音樂。播放本地音樂相對簡單。播放雲端音樂通常是邊下載邊播放,一般用DLNA或者Apple的Airplay等協議實現下載,其他的就跟
播放本地音樂一樣了。播放本地音樂的軟件架構通常如下:

技術分享

首先要解析音頻文件頭得到相關信息,有codec類型,采樣率,通道數等。然後根據這些對每一幀音頻數據進行解碼得到PCM數據,如果有需要的話還要做後處理,比如均衡器,使音樂更美妙動聽。處理完後把PCM數據放進ring buffer中。播放線程會定時的從ring buffer中取走需要的PCM通過I2S總線送給codec芯片,codec芯片把PCM數據轉換成模擬信號然後播放出來,這樣就可以聽到動聽的音樂了。

嵌入式音頻軟件的架構