AV架構分層設計
AV架構主要抽象為四個層次:

媒體接入層: access層,負責媒體資料的來源,可能是file、http、fifo、mem等。
解複用層: demux層,負責把容器裡的音視訊資料剝離出來,然後分别送給audio/video decoder。
解碼層: decoder層,将解碼完成後的資料(yuv、pcm)送給audio/video output輸出。
輸出層: output層,負責将decoder過來的資料呈現/播放出來。
如果把資料想象成流水的話,每層的功能雖然不同,但是他們大緻抽象的功能都是接收上個子產品過來的資料,然後加工并把加工後的資料送到下一個子產品。把上述這些層通過某種方式連接配接起來,就形成了一個音頻播放器。
媒體接入層(stream)
UML設計如下圖所示:
stream_ops_http、stream_ops_mem、stream_ops_file、stream_ops_fifo分别對應于網絡流、記憶體流、本地檔案流、fifo流取流播放。
其中語音合成(TTS)流的播放可基于stream_ops_fifo實作。
後續對于新增的媒體接入類型,可根據struct stream_ops結構中定義的類型,實作對應的接口即可擴充。
媒體接入層中各種流類型的url格式定義規則如下表所示:
流類型 URL字首 URL格式
網絡流 http(s):// http(s)://ip:port/xx.mp3
檔案流(SD卡) file:// file:///fatfs0/xx.mp3?avformat=%s&avcodec=%u&channel=%u&rate=%u
記憶體流 mem:// mem://addr=%u&size=%u&avformat=%u&avcodec=%u&channel=%u&rate=%u
fifo流 fifo:// fifo://tts/1?avformat=%s&avcodec=%u&channel=%u&rate=%u
對于能夠探測到媒體資訊的碼流,url格式中的avformat、avcodec、channel、rate字段不是必須的。
這些配置項一般用于raw pcm的播放(通過這些參數傳入裸流的具體格式)。
avformat字段可選有rawaudio/wav/mp3/m4a。
avcodec字段可選有pcm_s16be/pcm_s32be/pcm_s16le/pcm_s32le/pcm_s8/pcm_u16be/pcm_u32be/pcm_u16le/pcm_u32le/pcm_u8。
url格式具體示例如下表所示:
流類型 示例
網絡流
http://www.baidu.com/1.mp3檔案流(SD卡) file:///fatfs0/test.MP3
記憶體流 mem://addr=765432&size=1024&avformat=rawaudio&avcodec=pcm_s16le &channel=1&rate=16000
fifo流 fifo://tts/1
解複用層(avformat)
其中demux_ops_wav、demux_ops_mp3、demux_ops_m4a分别對應于wav、mp3、m4a音頻複用格式解複用。解複用出來的一幀音頻資料會被送到對應的解碼器進行解碼。
目前支援wav、mp3、mp4、adts、flac、asf、amr等格式的解複用
後續對于新增的解複用格式,可根據struct demux_ops結構中定義的類型,實作對應的接口即可擴充
解碼層(avcodec)
該層将demux解複用後出來的一幀幀編碼資料解碼成音視訊裸資料(pcm/yuv)。
在某些情況下,某些編碼類型解碼時可能占用很高的主頻(如在ck803ef上,HE-AAC解碼主頻需求在240M左右),此時可能需要通過核間通信(mailbox/IPC)将解碼工作放到另一核上執行。
解碼層為考慮擴充性,支援本地(核内)與跨核(核間)解碼。其中核間解碼适配層請參考av/avcodec/ad_ipc.c使用。
核間解碼結構如下圖所示:
核間解碼時序圖如下所示:
核内/核間解碼架構設計如下圖所示:
解碼器UML設計如下圖所示:
其中ad_ops_pvmp3、ad_ops_rawaudio、ad_ops_opus、ad_ops_fdk分别對應于mp3、裸pcm(解碼透傳)、opus、aac音頻編碼格式解碼
目前支援mp3、aac、adpcm_ms、flac、amrnb、amrwb等格式的解碼
後續對于新增的解碼類型,可根據struct ad_ops結構中定義的類型,實作對應的接口即可擴充
輸出層(output)
其中ao_ops_alsa對應于采用alsa标準音頻輸出接口實作。通過alsa層來屏蔽各産品不同codec的實作
後續對于新增的輸出類型,可根據struct ao_ops結構中定義的類型或在alsa/sound驅動層,實作對應的接口即可擴充
音頻輸對外連結路如下圖所示: