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)。大端模式如下圖所示:
一般我們描述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í)行工具嗅剖。
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
工具 | 簡(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
// 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
- AVFrame 結(jié)構(gòu)體定義在 <libavutil/frame.h> 温技,看源碼去這里找革为,略長(zhǎng)不粘。
- 簡(jiǎn)介: AVFrame中存儲(chǔ)的是經(jīng)過(guò)解碼后的原始數(shù)據(jù)舵鳞。在解碼中震檩,AVFrame是解碼器的輸出;在編碼 中,AVFrame是編碼器的輸入蜓堕。
結(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
- 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 中結(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