天天看點

基于YoC的輕量級AV架構設計

AV架構分層設計

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

基于YoC的輕量級AV架構設計

媒體接入層: access層,負責媒體資料的來源,可能是file、http、fifo、mem等。

解複用層: demux層,負責把容器裡的音視訊資料剝離出來,然後分别送給audio/video decoder。

解碼層: decoder層,将解碼完成後的資料(yuv、pcm)送給audio/video output輸出。

輸出層: output層,負責将decoder過來的資料呈現/播放出來。

如果把資料想象成流水的話,每層的功能雖然不同,但是他們大緻抽象的功能都是接收上個子產品過來的資料,然後加工并把加工後的資料送到下一個子產品。把上述這些層通過某種方式連接配接起來,就形成了一個音頻播放器。

媒體接入層(stream)

UML設計如下圖所示:

基于YoC的輕量級AV架構設計

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)

基于YoC的輕量級AV架構設計

其中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使用。

核間解碼結構如下圖所示:

基于YoC的輕量級AV架構設計

核間解碼時序圖如下所示:

基于YoC的輕量級AV架構設計

核内/核間解碼架構設計如下圖所示:

基于YoC的輕量級AV架構設計

解碼器UML設計如下圖所示:

基于YoC的輕量級AV架構設計

其中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)

基于YoC的輕量級AV架構設計

其中ao_ops_alsa對應于采用alsa标準音頻輸出接口實作。通過alsa層來屏蔽各産品不同codec的實作

後續對于新增的輸出類型,可根據struct ao_ops結構中定義的類型或在alsa/sound驅動層,實作對應的接口即可擴充

音頻輸對外連結路如下圖所示:

基于YoC的輕量級AV架構設計

繼續閱讀