媒體的整體的處理流程大概如上土砂,從存儲(chǔ)/網(wǎng)絡(luò)中讀入數(shù)據(jù),解析格式進(jìn)行解封裝然后進(jìn)行解碼氮凝,對(duì)解碼后的數(shù)據(jù)進(jìn)行處理羔巢,重新編碼,進(jìn)行封裝罩阵,進(jìn)行存儲(chǔ)輸出
首先從輸入輸出入手竿秆,ffmpeg以AVFormatContext為中心,左側(cè)是舉了一個(gè)輸出的類圖格式稿壁,輸入也類似幽钢,如下:
AVFormatContext中打開(kāi)文件的時(shí)候首先會(huì)根據(jù)打開(kāi)的文件名字以及文件內(nèi)容進(jìn)行封裝格式猜測(cè),根據(jù)不同文件的類型生成AVOutputFormat傅是,其中實(shí)現(xiàn)了寫的函數(shù)匪燕,寫的時(shí)候會(huì)根據(jù)不同的封裝格式進(jìn)行寫(讀數(shù)據(jù)的時(shí)候也同理);
讀和寫都需要最終的對(duì)象, ffmpeg通過(guò)AVIOContext來(lái)進(jìn)行管理,通過(guò)打開(kāi)對(duì)象的名字不同喧笔,自動(dòng)識(shí)別屬于http還是rtmp或者是一個(gè)文件等等帽驯,對(duì)應(yīng)的它們都在ffmpeg中作為一個(gè)URLContext,對(duì)于一個(gè)文件而言书闸,URLContext中的priv_data存儲(chǔ)了打開(kāi)的fd尼变,而prot則是讀寫操作的接口。
右側(cè)則是對(duì)媒體幀數(shù)據(jù)的屬性管理浆劲,ffmpeg使用stream來(lái)進(jìn)行管理嫌术, streams中存儲(chǔ)了幀數(shù)據(jù)中的相應(yīng)屬性哀澈,對(duì)于視頻,譬如編解碼器信息度气,幀率割按,分辨率,時(shí)間戳等磷籍,對(duì)于音頻适荣,有編碼器信息,采樣率等等择示; 當(dāng)從輸入流讀取數(shù)據(jù)之后束凑,需要根據(jù)這些屬性對(duì)輸出流進(jìn)行相應(yīng)的的設(shè)置