FFmpeg基礎(chǔ)知識(shí)

1 FFmpeg 概述

引自 百度百科:FFmpeg
FFmpeg 是一套可以用來(lái)記錄掺逼、轉(zhuǎn)換數(shù)字音頻蔓同、視頻,并能將其轉(zhuǎn)化為流的開(kāi)源計(jì)算機(jī)程序惨撇。采用 LGPL 或 GPL 許可證葵萎。它提供了錄制分蓖、轉(zhuǎn)換以及流化音視頻的完整解決方案。它包含了非常先進(jìn)的 音頻/視頻編解碼庫(kù) libavcodec拷窜,為了保證高可移植性和編解碼質(zhì)量开皿, libavcodec 里很多 code 都是 從頭開(kāi)發(fā)的。
FFmpeg 在 Linux 平臺(tái)下開(kāi)發(fā)篮昧,但它同樣也可以在其它操作系統(tǒng)環(huán)境中編譯運(yùn)行赋荆,包括 Windows、 Mac OS X 等懊昨。這個(gè)項(xiàng)目最早由 Fabrice Bellard 發(fā)起窄潭,2004年至2015年間由 Michael Niedermayer 主 要負(fù)責(zé)維護(hù)。許多 FFmpeg 的開(kāi)發(fā)人員都來(lái)自 MPlayer 項(xiàng)目酵颁,而且當(dāng)前 FFmpeg 也是放在 MPlayer 項(xiàng)目組的服務(wù)器上嫉你。項(xiàng)目的名稱來(lái)自 MPEG 視頻編碼標(biāo)準(zhǔn) ,前面的 "FF" 代表 "Fast Forward" 躏惋。

2 音視頻各階段編解碼格式

播放與錄制音視頻流程

播放與錄制音視頻流程

2.1 視頻

2.1.1 視頻像素格式

  • ARGB_8888 : 常見(jiàn)的圖像像素編碼格式幽污,用 4 個(gè)字節(jié)分別存儲(chǔ)圖像的 A 透明度信息, R 紅色通道信 息簿姨, G 綠色通道信息距误, B 藍(lán)色通道信息。
  • YUV : YUV像素格式來(lái)源于RGB像素格式扁位,通過(guò)公式運(yùn)算准潭,YUV三分量可以還原出RGB,YUV轉(zhuǎn)RGB的 公式如下:
R = Y + 1.403V
G = Y - 0.344U - 0.714
V B = Y + 1.770U

一般域仇,將 RGB 和 YUV 的范圍均限制在 [0, 255] 間刑然,則有如下轉(zhuǎn)換公式:

R = Y + 1.403(V - 128)
G = Y - 0.344(U - 128) - 0.714(V - 128) 
B = Y + 1.770(U - 128)

YUV 格式根據(jù)采樣方式不同又分為 YUV444 , YUV422 , YUV420 ,詳情參考這篇博客 暇务。

2.1.2 視頻壓縮格式

壓縮格式 適用靜態(tài)圖或視頻泼掠? 特征描述 應(yīng)用場(chǎng)景
JPEG / JPEG 2000 靜態(tài)圖 JPEG / JPEG 2000 利用的壓縮算法不同 DSC 等
M-JPEG 視頻 只是由連續(xù)的JPEG圖像組成 PC-CAM 怔软,監(jiān)控等
MPEG1 視頻 MPEG 組織定義的 VCD 應(yīng)用程序的標(biāo)準(zhǔn) VCD 等
MPEG2 視頻 MPEG 組織定義的 DVD ,DVB 應(yīng)用程序的標(biāo)準(zhǔn) DVD 武鲁,DVB 爽雄,監(jiān)控等
MPEG4 視頻 MPEG 組織定義的網(wǎng)絡(luò)應(yīng)用程序的標(biāo)準(zhǔn) 監(jiān)控,VOD 沐鼠,IPTV , PMP 等
H.261 視頻 國(guó)際電聯(lián)定義基本互聯(lián)網(wǎng)多媒體應(yīng)用標(biāo)準(zhǔn) 監(jiān)控叹谁,視頻會(huì)議等
H.263 視頻 國(guó)際電聯(lián)定義低帶寬互聯(lián)網(wǎng)多媒體應(yīng)用標(biāo)準(zhǔn) 監(jiān)控饲梭,視頻會(huì)議等
H.264 視頻 具有更高壓縮效率的下一代標(biāo)準(zhǔn) IPTV ,監(jiān)控 焰檩,多媒體等
WMV9 視頻 微軟定義的下一代標(biāo)準(zhǔn) IPTV 憔涉, VOD
AVS1.0 視頻 中國(guó)自有專利標(biāo)準(zhǔn)

2.2 音頻

2.2.1 音頻采樣數(shù)據(jù)格式

參考了 Allan_Wang 的 音視頻學(xué)習(xí)框架

  • 采樣
    所謂采樣就是在時(shí)間軸上對(duì)模擬信號(hào)進(jìn)行數(shù)字化析苫,根據(jù)采樣定理( 香農(nóng)采樣定理兜叨,奈奎斯特采樣 定理),按照比聲音最高頻率 2 倍以上的頻率進(jìn)行采樣(AD轉(zhuǎn)換)衩侥。人耳聽(tīng)力范圍是 20Hz~20kHz 国旷,所以采樣頻率一般為 40kHz 左右,常用的有 44.1kHz (44100 次/s 采樣)茫死、 48kHz 等跪但,采樣率越高, 音質(zhì)越好 峦萎。

  • 量化
    是指在幅度軸上對(duì)信號(hào)進(jìn)行數(shù)字化屡久。對(duì)模擬音頻信號(hào)的幅度進(jìn)行數(shù)字化,它決定了模擬信號(hào)數(shù)字 化以后的動(dòng)態(tài)范圍爱榔,常用的有8位被环、12位和16位。 量化位越高详幽,信號(hào)的動(dòng)態(tài)范圍越大筛欢,數(shù)字化后的 音頻信號(hào)就越可能接近原始信號(hào)

音頻采樣
  • PCM 編碼
    PCM(Pulse Code Modulation)也被稱為脈沖編碼調(diào)制妒潭。PCM 音頻數(shù)據(jù)是未經(jīng)壓縮的音頻采樣數(shù)據(jù)裸流 悴能,它是由模擬信號(hào)經(jīng)過(guò)采樣、量化雳灾、編碼轉(zhuǎn)換成的標(biāo)準(zhǔn)的數(shù)字音頻數(shù)據(jù)漠酿。

如果是單聲道的音頻文件,采樣數(shù)據(jù)按時(shí)間的先后順序依次存入(有的時(shí)候也會(huì)采用 LRLRLR 方式存 儲(chǔ)谎亩,只是另一個(gè)聲道的數(shù)據(jù)為 0)炒嘲,如果是雙聲道的話就按照 LRLRLR 的方式存儲(chǔ)宇姚,存儲(chǔ)的時(shí)候還和機(jī) 器的大小端有關(guān)。大端模式如下圖所示:

image-20201219102304754

一般我們描述PCM音頻數(shù)據(jù)的參數(shù)的時(shí)候有如下描述方式

44100HZ 16bit stereo : 每秒鐘有 44100 次采樣夫凸,采樣數(shù)據(jù)用 16 位( 2 字節(jié))記錄, 雙聲道(立體聲);

22050HZ 8bit mono : 每秒鐘有 22050 次采樣浑劳,采樣數(shù)據(jù)用 8 位( 1 字節(jié))記錄, 單聲道。

44100Hz 指的是采樣率夭拌,它的意思是每秒取樣44100次魔熏。采樣率越大,存儲(chǔ)數(shù)字音頻所占的空間就越大鸽扁。 16bit 指的是采樣精度蒜绽,意思是原始模擬信號(hào)被采樣后,每一個(gè)采樣點(diǎn)在計(jì)算機(jī)中用 16 位(兩個(gè)字節(jié))來(lái)表示桶现。采樣精度越高越能精細(xì)地表示模擬信號(hào)的差異躲雅。

2.2.2 音頻壓縮數(shù)據(jù)格式

格式 描述 備注
MP3 全名是 MPEG Audio Layer-3 ,簡(jiǎn)單的說(shuō)就是一種聲音文件的壓縮格式骡和。1987 年德國(guó)的研究機(jī)構(gòu)IIS(Institute Integrierte Schaltungen)開(kāi)始著手一項(xiàng)聲音編碼及數(shù)字音頻廣播的計(jì)劃相赁,名稱叫做 EUREKA EUl47 ,即 MP3 的前身慰于。之后钮科,這項(xiàng)計(jì)劃由 IIS 與Erlangen 大學(xué)共同合作,開(kāi)發(fā)出一套非常強(qiáng)大的算法东囚,經(jīng)由 150 國(guó)際標(biāo)準(zhǔn)組織認(rèn)證之后跺嗽,符合 ISO- MPEG Audio Layer-3 標(biāo)準(zhǔn),就成為現(xiàn)在的 MP3页藻。 MPEG 音頻編碼的層次越高桨嫁,編碼器越復(fù)雜,壓縮率也越高 (MP1 壓縮率 4:1 份帐,MP2 壓縮率 6:1 - 8:1 璃吧,MP3 壓縮率 10:1 - 12:1)。有損壓縮——感官編碼技術(shù)废境,去除數(shù)據(jù)中人類(lèi)感官察覺(jué)不到的數(shù)據(jù)畜挨。
AAC 高級(jí)音頻編碼(AdvancedAudio Coding,AAC)一種基于 MPEG-4 的音頻編碼技術(shù)噩凹,它由杜比實(shí)驗(yàn)室巴元、AT&T 等公司共同研發(fā),目的是替換 MP3 編碼方式驮宴。作為一種高壓縮比的音頻壓縮算法逮刨,AAC 的數(shù)據(jù)壓縮比約為 18:1 ,壓縮后的音質(zhì)可以同未壓縮的 CD 音質(zhì)相媲美堵泽。因此修己,相對(duì)于 MP3 恢总、WMA 等音頻編碼標(biāo)準(zhǔn)來(lái)說(shuō),在相同質(zhì)量下碼率更低睬愤,有效地節(jié)約了傳輸帶寬片仿,被廣泛得應(yīng)用于互聯(lián)網(wǎng)流媒體、IPTV 等領(lǐng)域 (低碼率尤辱,高音質(zhì))砂豌。 參考這篇博客 特點(diǎn): 1.比特率:AAC- 最高 512kbps(雙聲道時(shí))/MP3- 32~320kbps 2.采樣率:AAC- 最高96kHz / MP3 - 最高48kHz 3.聲道數(shù):AAC– 最高48個(gè)全音域聲道/MP3 - 兩聲道 4.采樣精度:AAC- 最高32bit / MP3 - 最高16bit 5.AAC的不足之處是啥刻,它屬于有損壓縮的格式奸鸯,相對(duì)于APE和FLAC等主流無(wú)損壓縮,音色“飽滿度”差距比較大可帽。另外,除了流媒體網(wǎng)絡(luò)傳輸窗怒,其所能支持的設(shè)備較少映跟。
WAV 微軟和 IBM 共同開(kāi)發(fā)的 PC 標(biāo)準(zhǔn)聲音格式,文件后綴名 .wav 扬虚,是一種通用的音頻數(shù)據(jù)文件努隙。 通常使用 WAV 格式用來(lái)保存一些沒(méi)有壓縮的音頻,也就是經(jīng)過(guò)PCM 編碼后的音頻辜昵,因此也稱為波形文件荸镊,依照聲音的波形進(jìn)行存儲(chǔ),因此要占用較大的存儲(chǔ)空間堪置。WAV 文件也可以存放壓縮音頻躬存,但其本身的文件結(jié)構(gòu)使之更加適合于存放原始音頻數(shù)據(jù)并用作進(jìn)一步的處理。
WMA Windows Media Audio舀锨,微軟針對(duì)網(wǎng)絡(luò)音頻開(kāi)發(fā)的數(shù)位音樂(lè)文件格式岭洲。 支持防復(fù)制,限制播放時(shí)間和播放次數(shù)甚至播放設(shè)備坎匿,支持串流技術(shù)盾剩,即一邊讀一邊播,輕松實(shí)現(xiàn)線上廣播替蔬。但是算法復(fù)雜且封閉告私。
RA Real Audio,是 RealNetwork 公司推出的一種流式壓縮聲音格式承桥,是為了解決網(wǎng)絡(luò)傳輸帶寬資源限制而設(shè)計(jì)的驻粟。 支持串流技術(shù),即一邊讀一邊播快毛,輕松實(shí)現(xiàn)線上廣播格嗅。支持使用特殊通訊協(xié)議來(lái)隱藏音樂(lè)文件的真實(shí) URI 番挺,實(shí)現(xiàn)僅在線播放不支持下載的功能。
格式 描述 備注
數(shù)據(jù)量小屯掖,占用存儲(chǔ)空間極小玄柏,
適合在網(wǎng)絡(luò)上傳輸。編輯修改靈
MID 是通過(guò)數(shù)字化樂(lè)器接口 MIDI 輸入的聲音文件的 活方便贴铜,可通過(guò)音序器自由的改
MID 擴(kuò)展名粪摘,這種文件只是像記樂(lè)譜一樣地記錄下演奏 變MIDI文件的曲調(diào)、音色绍坝、速度
的符號(hào)徘意,所以體積是所有音頻格式中最小的。 等轩褐,甚至可以改換不同的樂(lè)器椎咧。
MIDI 聲音僅適于重現(xiàn)打擊樂(lè)或一
些電子樂(lè)器的聲音(音源窄)。

2.2.3 音視頻封裝數(shù)據(jù)格式

格式 后綴 描述
AVI .avi 它的英文全稱為Audio Video Interleaved把介,即音頻視頻交錯(cuò)格式勤讽。它于1992 年被 Microsoh 公司推出。這種視頻格式的優(yōu)點(diǎn)是圖像質(zhì)量好拗踢。由于無(wú)損 AVI 可以保存 alpha 通道脚牍,經(jīng)常被我們使用。缺點(diǎn)太多巢墅,體積過(guò)于龐大诸狭,而且更加糟糕的是壓縮標(biāo)準(zhǔn)不統(tǒng)一,最普遍的現(xiàn)象就是高版本W(wǎng)indows 媒體播放器播放不了采用早期編碼編輯的 AVI 格式視頻君纫,而低版本 Windows 媒體播放器又播放不了采用最新編碼編輯的 AVI 格式視頻驯遇, 所以我們?cè)谶M(jìn)行一些 AVI 格式的視頻播放時(shí)常會(huì)出現(xiàn)由于視頻編碼問(wèn)題而造成的視頻不能播放或即使能夠播放,但存在不能調(diào)節(jié)播放進(jìn)度和播放 時(shí)只有聲音沒(méi)有圖像等一些莫名其妙的問(wèn)題庵芭。
DV-AVI .avi DV 的英文全稱是 Digital Video Format妹懒,是由索尼、松下双吆、JVC 等多家廠商聯(lián)合提出的一種家用數(shù)字視頻格式眨唬。
QuickTime File Format .mov 美國(guó) Apple 公司開(kāi)發(fā)的一種視頻格式,默認(rèn)的播放器是蘋(píng)果的 QuickTime 好乐。具有較高的壓縮比率和較完美的視頻清晰度等特點(diǎn)匾竿,并可以保存 alpha 通道。
MPEG .mpg .mpeg .mpe .dat .vob .asf .3gp .mp4 等 它的英文全稱為 Moving Picture Experts Group蔚万,即運(yùn)動(dòng)圖像專家組格式岭妖, 該專家組建于 1988 年,專門(mén)負(fù)責(zé)為 CD 建立視頻和音頻標(biāo)準(zhǔn),而成員都是為視頻昵慌、音頻及系統(tǒng)領(lǐng)域的技術(shù)專家假夺。MPEG文件格式是運(yùn)動(dòng)圖像壓縮算法的國(guó)際標(biāo)準(zhǔn)。MPEG 格式目前有三個(gè)壓縮標(biāo)準(zhǔn)斋攀,分別是 MPEG-1 已卷、MPEG-2 、和MPEG-4 淳蔼。
WMV .wmv .asf 它的英文全稱為 Windows Media Video 侧蘸,也是微軟推出的一種采用獨(dú)立編碼方式并且可以直接在網(wǎng)上實(shí)時(shí)觀看視頻節(jié)目的文件壓縮格式。
Real Video .rm .rmvb Real Networks 公司所制定的音頻視頻壓縮規(guī)范稱為 Real Media 鹉梨。用戶可以使用 RealPlayer 根據(jù)不同的網(wǎng)絡(luò)傳輸速率制定出不同的壓縮比率讳癌,從而實(shí)現(xiàn)在低速率的網(wǎng)絡(luò)上進(jìn)行影像數(shù)據(jù)實(shí)時(shí)傳送和播放。RMVB 格式:這是一種由 RM 視頻格式升級(jí)延伸出的新視頻格式存皂,當(dāng)然性能上有很大的提升晌坤。RMVB 視頻也是有著較明顯的優(yōu)勢(shì),一部大小為 700MB 左右的 DVD 影片旦袋,如果將其轉(zhuǎn)錄成同樣品質(zhì)的 RMVB 格式泡仗,其個(gè)頭最多也就 400MB 左右。大家可能注意到了猜憎,以前在網(wǎng)絡(luò)上下載電影和視頻的時(shí)候,經(jīng)常 接觸到 RMVB 格式搔课,但是隨著時(shí)代的發(fā)展這種格式被越來(lái)越多的更優(yōu)秀的格式替代胰柑,著名的人人影視字幕組在2013年已經(jīng)宣布不再壓制RMVB格式視頻。
Flash Video .flv 由 Adobe Flash 延伸出來(lái)的的一種流行網(wǎng)絡(luò)視頻封裝格式爬泥。隨著視頻網(wǎng)站的豐富柬讨,這個(gè)格式已經(jīng)非常普及。
Mastroska .mkv 是一種新的多媒體封裝格式袍啡,這個(gè)封裝格式可把多種不同編碼的視頻及16 條或以上不同格式的音頻和語(yǔ)言不同的字幕封裝到一個(gè) Matroska Media 檔內(nèi)踩官。它也是其中一種開(kāi)放源代碼的多媒體封裝格式。 Matroska 同時(shí)還可以提供非常好的交互功能境输,而且比 MPEG 的方便蔗牡、強(qiáng)大。

3 獲取 FFmpeg

進(jìn)入 FFmpeg 官網(wǎng)下載開(kāi)源代碼和可執(zhí)行工具嗅剖。

image-20201219102907591

3.1 源代碼

FFmpeg 是基于 C 語(yǔ)言的開(kāi)源項(xiàng)目辩越,其源代碼中包含了所有開(kāi)發(fā)人員所需要的包括音視頻編解碼,音視頻播放信粮,音視頻處理等 .c/.h 文件黔攒,并且源代碼根據(jù)功能進(jìn)行了模塊劃分。主要包含以下幾個(gè)模塊:

模塊 簡(jiǎn)介
libavformat 用于各種音視頻封裝格式的生成和解析
libavcodec 用于各種類(lèi)型聲音/圖像的編解碼
libavfilter 音視頻濾波器的開(kāi)發(fā),例如水印
libavutil 包含公共的工具函數(shù)
libswresample 原始音頻格式轉(zhuǎn)碼
libswscale 圖像格式轉(zhuǎn)換督惰、縮放等不傅,如 rgb888 轉(zhuǎn)換 yuv420
libpostproc 用于后期效果處理

FFmpeg 實(shí)際上也是一個(gè)引擎,能夠集成包括 librtmp赏胚、libmp3lame 等第三方的庫(kù)访娶,以 FFmpeg 統(tǒng)一接口使用

3.2 可執(zhí)行工具

可執(zhí)行工具位于 bin 目錄下

   ./configure --prefix=/usr/local/ffmpeg --enable-debug=3 --enable-shared --disable-static
   make clean
   make -j 4
   make install
cd /usr/local/ffmpeg

image-20201219103513081
工具 簡(jiǎn)介 舉例
ffmpeg 對(duì)音視頻進(jìn)行各種處理(轉(zhuǎn)碼、縮放等) ffmpeg -i /dir/input.mp4 -s 100x100 /dir/output.mp4
ffplay 播放音視頻 ffplay -i /dir/input.mp4
ffprobe 查看音視頻文件詳細(xì)信息 ffprobe -i /dir/input.mp4 ffprobe -i /dir/input.mp4 -v quiet -print_format json -show_streams

4.FFmpeg 中幾個(gè)重要的結(jié)構(gòu)體 簡(jiǎn)單介紹

結(jié)構(gòu)體一 AVPacket

參考博客 FFmpeg 結(jié)構(gòu)體:AVPacket 解析

// C
typedef struct AVPacket {
AVBufferRef *buf; //用來(lái)管理data指針引用的數(shù)據(jù)緩存
int64_t pts; //顯示時(shí)間栅哀,結(jié)合AVStream->time_base轉(zhuǎn)換成時(shí)間戳
int64_t dts; //解碼時(shí)間震肮,結(jié)合AVStream->time_base轉(zhuǎn)換成時(shí)間戳
uint8_t *data; //★指向保存壓縮數(shù)據(jù)的指針,這就是AVPacket的實(shí)際數(shù)據(jù)
int size; //data的大小
int stream_index; //packet在stream的index位置
int flags; //標(biāo)示留拾,結(jié)合AV_PKT_FLAG使用戳晌,其中最低為1表示該數(shù)據(jù)是一個(gè)關(guān)鍵幀。 
  /*
* flags 可選:
* #define AV_PKT_FLAG_KEY 0x0001 //關(guān)鍵幀
* #define AV_PKT_FLAG_CORRUPT 0x0002 //損壞的數(shù)據(jù)
* #define AV_PKT_FLAG_DISCARD 0x0004 /丟棄的數(shù)據(jù) 
*/
AVPacketSideData *side_data; //容器提供的一些附加數(shù)據(jù)
int side_data_elems; //邊緣數(shù)據(jù)元數(shù)個(gè)數(shù)
int64_t duration; //數(shù)據(jù)的時(shí)長(zhǎng)痴柔,以所屬媒體流的時(shí)間基準(zhǔn)為單位沦偎,未知?jiǎng)t值為默認(rèn)值0 int64_t pos; //數(shù)據(jù)在流媒體中的位置,未知?jiǎng)t值為默認(rèn)值-1
    #if FF_API_CONVERGENCE_DURATION
    attribute_deprecated
    int64_t convergence_duration; //該字段已deprecated,不在使用 
  #endif
} AVPacket;
  • AVPacket 結(jié)構(gòu)體定義在 <libavcodec/avcodec.h> 中咳蔚,看源碼英文注釋去這里找豪嚎。
  • 簡(jiǎn)介:AVPacket是FFmpeg中很重要的一個(gè)數(shù)據(jù)結(jié)構(gòu),它保存了解復(fù)用(demuxer)之后谈火,解碼(decode)之前的數(shù)據(jù)(仍然是壓縮后的數(shù)據(jù))和關(guān)于這些數(shù)據(jù)的一些附加的信息侈询,如顯示時(shí)間 戳(pts),解碼時(shí)間戳(dts),數(shù)據(jù)時(shí)長(zhǎng)(duration)糯耍,所在流媒體的索引(stream_index)等等扔字。
  • AVPacket 中的內(nèi)存管理請(qǐng)參考上述引用的參考博客。

結(jié)構(gòu)體二 AVFrame

參考博客 FFmpeg 數(shù)據(jù)結(jié)構(gòu) AVFrame

  • AVFrame 結(jié)構(gòu)體定義在 <libavutil/frame.h> 温技,看源碼去這里找革为,略長(zhǎng)不粘。
  • 簡(jiǎn)介: AVFrame中存儲(chǔ)的是經(jīng)過(guò)解碼后的原始數(shù)據(jù)舵鳞。在解碼中震檩,AVFrame是解碼器的輸出;在編碼 中,AVFrame是編碼器的輸入蜓堕。

結(jié)構(gòu)體三 AVFormatContext

參考博客 FFmpeg 結(jié)構(gòu)體分析:AVFormatContext

  • AVFormatContext 結(jié)構(gòu)體定義在 <libavformat/avformat.h> 中抛虏,看源碼去這里找,略長(zhǎng)不粘俩滥。
  • 簡(jiǎn)介:在使用 FFmpeg 進(jìn)行開(kāi)發(fā)的時(shí)候嘉蕾,AVFormatContext 是一個(gè)貫穿始終的數(shù)據(jù)結(jié)構(gòu),很多函數(shù) 都要用到它作為參數(shù)霜旧。它是 FFmpeg 解封裝(flv错忱,mp4儡率,rmvb,avi)功能的結(jié)構(gòu)體。下面看幾個(gè) 主要變量的作用(在這里考慮解碼的情況):
// C
struct AVInputFormat *iformat; //輸入數(shù)據(jù)的封裝格式
AVIOContext *pb; //輸入數(shù)據(jù)的緩存
unsigned int nb_streams; //視音頻流的個(gè)數(shù)
AVStream **streams; //視音頻流
char filename[1024]; //文件名
int64_t duration; //時(shí)長(zhǎng)(單位:微秒ms,轉(zhuǎn)換為秒需要除以1_000_000) int bit_rate; //比特率(單位bps荚孵,轉(zhuǎn)換為kbps需要除以1_000) AVDictionary *metadata; //元數(shù)據(jù)

結(jié)構(gòu)體四 AVCodecContext

參考博客 FFmpeg 結(jié)構(gòu)體分析:AVCodecContext

  • AVCodecContext 結(jié)構(gòu)體定義在 <libavcodec/avcodec.h> 中,看源碼去這里找眉孩,略長(zhǎng)不粘。
  • 簡(jiǎn)介: 一些關(guān)鍵的變量來(lái)看看(這里只考慮解碼)勒葱。
// C
enum AVMediaType codec_type; //編解碼器的類(lèi)型(視頻浪汪,音頻...)
struct AVCodec *codec; //采用的解碼器AVCodec(H.264,MPEG2...)
int bit_rate; //平均比特率
uint8_t *extradata; int extradata_size; //針對(duì)特定編碼器包含的附加信息(例如對(duì)于H.264解碼器來(lái) 說(shuō),存儲(chǔ)SPS凛虽,PPS等)
AVRational time_base; //根據(jù)該參數(shù)死遭,可以把PTS轉(zhuǎn)化為實(shí)際的時(shí)間(單位為秒s)
int width, height; //如果是視頻的話,代表寬和高
int refs; //運(yùn)動(dòng)估計(jì)參考幀的個(gè)數(shù)(H.264的話會(huì)有多幀凯旋,MPEG2這類(lèi)的一般就沒(méi)有了)
int sample_rate; //采樣率(音頻)
int channels; //聲道數(shù)(音頻)
enum AVSampleFormat sample_fmt; //采樣格式
int profile; //型(H.264里面就有呀潭,其他編碼標(biāo)準(zhǔn)應(yīng)該也有)
int level; //級(jí)(和profile差不太多)

重要結(jié)構(gòu)體之間的關(guān)系

參考博客 FFmpeg 中最關(guān)鍵的結(jié)構(gòu)體之間的關(guān)系

FFmpeg 中結(jié)構(gòu)體很多。最關(guān)鍵的結(jié)構(gòu)體可以分成以下幾類(lèi):

解協(xié)議(http, rtsp, rtmp, mms)

  • AVIOContext 至非,URLProtocol 钠署,URLContext 主要存儲(chǔ)視音頻使用的協(xié)議的類(lèi)型以及狀態(tài)。URLProtocol 存 儲(chǔ)輸入視音頻使用的封裝格式荒椭。每種協(xié)議都對(duì)應(yīng)一個(gè) URLProtocol 結(jié)構(gòu)(注意:FFmpeg 中文件也被當(dāng) 做一種協(xié)議 “file” )谐鼎。

解封裝(flv, avi, rmvb, mp4)

  • AVFormatContext 主要存儲(chǔ)視音頻封裝格式中包含的信息;AVInputFormat 存儲(chǔ)輸入視音頻使用的封裝格式。每種視音頻封裝格式都對(duì)應(yīng)一個(gè) AVInputFormat 結(jié)構(gòu)趣惠。

解碼(h264, mpeg2, aac, mp3)

  • 每個(gè) AVStream 存儲(chǔ)一個(gè)視頻/音頻流的相關(guān)數(shù)據(jù);每個(gè) AVStream 對(duì)應(yīng)一個(gè) AVCodecContext 该面,存儲(chǔ)該視 頻/音頻流使用解碼方式的相關(guān)數(shù)據(jù);每個(gè) AVCodecContext 中對(duì)應(yīng)一個(gè) AVCodec ,包含該視頻/音頻對(duì)應(yīng) 的解碼器信卡。每種解碼器都對(duì)應(yīng)一個(gè) AVCodec 結(jié)構(gòu)。

存數(shù)據(jù)

視頻的話题造,每個(gè)結(jié)構(gòu)一般是存一幀;音頻可能有好幾幀

  • 解碼前數(shù)據(jù):AVPacket
  • 解碼后數(shù)據(jù):AVFrame
重要結(jié)構(gòu)體之間的關(guān)系
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末傍菇,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子界赔,更是在濱河造成了極大的恐慌丢习,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件淮悼,死亡現(xiàn)場(chǎng)離奇詭異咐低,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)袜腥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)见擦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事鲤屡∷鹛担” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵酒来,是天一觀的道長(zhǎng)卢未。 經(jīng)常有香客問(wèn)我,道長(zhǎng)堰汉,這世上最難降的妖魔是什么辽社? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮翘鸭,結(jié)果婚禮上滴铅,老公的妹妹穿的比我還像新娘。我一直安慰自己矮固,他們只是感情好失息,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著档址,像睡著了一般盹兢。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上守伸,一...
    開(kāi)封第一講書(shū)人閱讀 49,111評(píng)論 1 285
  • 那天绎秒,我揣著相機(jī)與錄音,去河邊找鬼尼摹。 笑死见芹,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蠢涝。 我是一名探鬼主播玄呛,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼和二!你這毒婦竟也來(lái)了徘铝?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤惯吕,失蹤者是張志新(化名)和其女友劉穎惕它,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體废登,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡淹魄,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了堡距。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片甲锡。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡兆蕉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出搔体,到底是詐尸還是另有隱情恨樟,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布疚俱,位于F島的核電站劝术,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏呆奕。R本人自食惡果不足惜养晋,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望梁钾。 院中可真熱鬧绳泉,春花似錦、人聲如沸姆泻。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)拇勃。三九已至四苇,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間方咆,已是汗流浹背月腋。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留瓣赂,地道東北人榆骚。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像煌集,于是被迫代替她去往敵國(guó)和親妓肢。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容