FFMPEG框架解析(一) —— 基本概覽

版本記錄

版本號(hào) 時(shí)間
V1.0 2017.12.31

前言

FFMPEG是一個(gè)多媒體轉(zhuǎn)碼、音視頻流化傳輸?shù)囊粋€(gè)第三方開(kāi)源框架,并且這個(gè)第三方庫(kù)是基于C語(yǔ)言的。 iOS平臺(tái)下的ffmpeg主要包括以下一些功能:影音的解碼、編碼、編碼轉(zhuǎn)換、混合、抽取、串流和濾鏡。

Overview

這是一個(gè)為iOS和tvOS應(yīng)用程序構(gòu)建FFmpeg庫(kù)的shell腳本。

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"。

使用FFMPEG作為內(nèi)核視頻播放器:

Mplayer,ffplay,射手播放器,暴風(fēng)影音,KMPlayer,QQ影音...

使用FFMPEG作為內(nèi)核的Directshow Filter:

ffdshow,lav filters...

使用FFMPEG作為內(nèi)核的轉(zhuǎn)碼工具:

ffmpeg,格式工廠...

事實(shí)上,F(xiàn)FMPEG的視音頻編解碼功能確實(shí)太強(qiáng)大了,幾乎囊括了現(xiàn)存所有的視音頻編碼標(biāo)準(zhǔn),因此只要做視音頻開(kāi)發(fā),幾乎離不開(kāi)它。

對(duì)于完全沒(méi)有視音頻技術(shù)背景的人來(lái)說(shuō),在學(xué)習(xí)FFmpeg之前最好先了解一下幾種最基本的視音頻數(shù)據(jù)的格式,可以參考下面的文章:

感興趣的可以參考下面這個(gè)大神的博客,我看了下,他總結(jié)的很全面很深入,想要學(xué)習(xí)的話可以關(guān)注他,我這里列出來(lái)的很多參考文章,也是他寫的或者他來(lái)出來(lái)的。

他的CSDN - 博客


相關(guān)結(jié)構(gòu)體的研究

ffmpeg的結(jié)構(gòu)體之間的關(guān)系參考文章

結(jié)構(gòu)體中每個(gè)變量的分析,參考文章:


Requirements


Usage

使用build-ffmpeg-tvos.sh用于tvOS。

  • To build everything:
  ./build-ffmpeg.sh
  • To build arm64 libraries:
./build-ffmpeg.sh arm64
  • To build fat libraries for armv7 and x86_64 (64-bit simulator):
  ./build-ffmpeg.sh armv7 x86_64
  • To build fat libraries from separately built thin libraries:
  ./build-ffmpeg.sh lipo

下載

您可以下載FFmpeg 3.4發(fā)行版的二進(jìn)制文件https://downloads.sourceforge.net/project/ffmpeg-ios/ffmpeg-ios-master.tar.bz2


External libraries - 外部鏈接庫(kù)

你應(yīng)該加下面的庫(kù)

  • libz.dylib
  • libbz2.dylib
  • libiconv.dylib

Influences

參考文章

1. [總結(jié)]FFMPEG視音頻編解碼零基礎(chǔ)學(xué)習(xí)方法
2.《基于 FFmpeg + SDL 的視頻播放器的制作》課程的視頻
3. 官方網(wǎng)站
4. ffmpeg參數(shù)中文詳細(xì)解釋
5. ffmpeg.exe詳細(xì)的使用說(shuō)明英文
6. ffplay的快捷鍵以及選項(xiàng)
7. ffplay英文詳細(xì)使用說(shuō)明
8. ffprobe.exe英文詳細(xì)使用說(shuō)明

ffmpeg庫(kù)的配置
1. 下載地址
2. FFMPEG 庫(kù)移植到 VC 需要的步驟
3. 最簡(jiǎn)單的基于FFMPEG+SDL的視頻播放器

視頻播放器
1. 100行代碼實(shí)現(xiàn)最簡(jiǎn)單的基于FFMPEG+SDL的視頻播放器
2. 最簡(jiǎn)單的基于FFMPEG+SDL的視頻播放器 ver2 (采用SDL2.0)
3. 最簡(jiǎn)單的基于FFmpeg的解碼器-純凈版(不包含libavformat)
4. ffmpeg函數(shù)介紹
5. SDL介紹
6. SDL GUIDE 中文譯本
7. YUV播放器源代碼
8. YUV Player Deluxe

音頻播放器
1. 最簡(jiǎn)單的基于FFMPEG+SDL的音頻播放器
2. 最簡(jiǎn)單的基于FFMPEG+SDL的音頻播放器 ver2 (采用SDL2.0)

ffplay播放器
1. FFplay源代碼分析:整體流程圖
2. 100行代碼實(shí)現(xiàn)最簡(jiǎn)單的基于FFMPEG+SDL的視頻播放器
3. 如何用FFmpeg編寫一個(gè)簡(jiǎn)單播放器
4. ffplay的快捷鍵以及選項(xiàng)
5. ffplay_vc2005
6. ffplay播放器移植VC的工程:ffplay for MFC
7. ffplay for mfc 代碼備忘
8. ffplay.c函數(shù)結(jié)構(gòu)簡(jiǎn)單分析(畫圖)

編碼

ffmpeg編碼我自己研究的不是很多,可以參考文章:

上面那篇文章是用的類庫(kù)比較舊,新版類庫(kù)的的使用可以參考下面幾篇文章。

上述編碼器使用libavformat和libavcodec兩個(gè)類庫(kù)完成了視頻的編碼工作。實(shí)際上編碼工作只需要libavcodec就可以了。因此更新了一個(gè)“純凈”的編碼器。該編碼器只使用libavcodec完成編碼工作: 最簡(jiǎn)單的基于FFmpeg的編碼器-純凈版(不包含libavformat)

轉(zhuǎn)碼

轉(zhuǎn)碼實(shí)際上是先解碼然后編碼。

不進(jìn)行轉(zhuǎn)碼,只進(jìn)行封裝格式轉(zhuǎn)換的程序可參考:最簡(jiǎn)單的基于FFMPEG的封裝格式轉(zhuǎn)換器(無(wú)編解碼)
轉(zhuǎn)碼程序可參考:最簡(jiǎn)單的基于FFMPEG的轉(zhuǎn)碼程序
比較復(fù)雜的轉(zhuǎn)碼程序可以參考ffmpeg.c,它移植到MFC下的工程:ffmpeg轉(zhuǎn)碼器移植VC的工程:ffmpeg for MFC
ffmpeg.c函數(shù)結(jié)構(gòu)簡(jiǎn)單分析:ffmpeg.c函數(shù)結(jié)構(gòu)簡(jiǎn)單分析(畫圖)

ffmpeg源代碼分析

【架構(gòu)圖】

FFmpeg源代碼結(jié)構(gòu)圖 - 解碼
FFmpeg源代碼結(jié)構(gòu)圖 -編碼

【通用】

FFmpeg源代碼簡(jiǎn)單分析:av_register_all()
FFmpeg源代碼簡(jiǎn)單分析:avcodec_register_all()
FFmpeg源代碼簡(jiǎn)單分析:內(nèi)存的分配和釋放(av_malloc()、av_free()等)
FFmpeg源代碼簡(jiǎn)單分析:常見(jiàn)結(jié)構(gòu)體的初始化和銷毀(AVFormatContext,AVFrame等)
FFmpeg源代碼簡(jiǎn)單分析:avio_open2()
FFmpeg源代碼簡(jiǎn)單分析:av_find_decoder()和av_find_encoder()
FFmpeg源代碼簡(jiǎn)單分析:avcodec_open2()
FFmpeg源代碼簡(jiǎn)單分析:avcodec_close()

【解碼】
圖解FFMPEG打開(kāi)媒體的函數(shù)avformat_open_input
FFmpeg源代碼簡(jiǎn)單分析:avformat_open_input()
FFmpeg源代碼簡(jiǎn)單分析:avformat_find_stream_info()
FFmpeg源代碼簡(jiǎn)單分析:av_read_frame()
FFmpeg源代碼簡(jiǎn)單分析:avcodec_decode_video2()
FFmpeg源代碼簡(jiǎn)單分析:avformat_close_input()

【編碼】
FFmpeg源代碼簡(jiǎn)單分析:avformat_alloc_output_context2()
FFmpeg源代碼簡(jiǎn)單分析:avformat_write_header()
FFmpeg源代碼簡(jiǎn)單分析:avcodec_encode_video()
FFmpeg源代碼簡(jiǎn)單分析:av_write_frame()
FFmpeg源代碼簡(jiǎn)單分析:av_write_trailer()

【其它】

FFmpeg源代碼簡(jiǎn)單分析:日志輸出系統(tǒng)(av_log()等)
FFmpeg源代碼簡(jiǎn)單分析:結(jié)構(gòu)體成員管理系統(tǒng)-AVClass
FFmpeg源代碼簡(jiǎn)單分析:結(jié)構(gòu)體成員管理系統(tǒng)-AVOption
FFmpeg源代碼簡(jiǎn)單分析:libswscale的sws_getContext()
FFmpeg源代碼簡(jiǎn)單分析:libswscale的sws_scale()
FFmpeg源代碼簡(jiǎn)單分析:libavdevice的avdevice_register_all()
FFmpeg源代碼簡(jiǎn)單分析:libavdevice的gdigrab

【腳本】

FFmpeg源代碼簡(jiǎn)單分析:makefile
FFmpeg源代碼簡(jiǎn)單分析:configure

偏底層的libavcodec的源代碼分析文章列表如下:

【解碼- libavcodec H.264 解碼器】
FFmpeg的H.264解碼器源代碼簡(jiǎn)單分析:概述
FFmpeg的H.264解碼器源代碼簡(jiǎn)單分析:解析器(Parser)部分
FFmpeg的H.264解碼器源代碼簡(jiǎn)單分析:解碼器主干部分
FFmpeg的H.264解碼器源代碼簡(jiǎn)單分析:熵解碼(EntropyDecoding)部分
FFmpeg的H.264解碼器源代碼簡(jiǎn)單分析:宏塊解碼(Decode)部分-幀內(nèi)宏塊(Intra)
FFmpeg的H.264解碼器源代碼簡(jiǎn)單分析:宏塊解碼(Decode)部分-幀間宏塊(Inter)

FFmpeg的H.264解碼器源代碼簡(jiǎn)單分析:環(huán)路濾波(LoopFilter)部分

【解碼-libavcodec HEVC 解碼器】

FFmpeg的HEVC解碼器源代碼簡(jiǎn)單分析:概述
FFmpeg的HEVC解碼器源代碼簡(jiǎn)單分析:解析器(Parser)部分
FFmpeg的HEVC解碼器源代碼簡(jiǎn)單分析:解碼器主干部分
FFmpeg的HEVC解碼器源代碼簡(jiǎn)單分析:CTU解碼(CTUDecode)部分-PU
FFmpeg的HEVC解碼器源代碼簡(jiǎn)單分析:CTU解碼(CTU Decode)部分-TU
FFmpeg的HEVC解碼器源代碼簡(jiǎn)單分析:環(huán)路濾波(LoopFilter)

后記

未完,待續(xù)~~~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 教程一:視頻截圖(Tutorial 01: Making Screencaps) 首先我們需要了解視頻文件的一些基...
    90后的思維閱讀 4,980評(píng)論 0 3
  • 寫在前面 如果您對(duì)音視頻技術(shù)感興趣,可以訂閱我的專題:音視頻專輯也可以關(guān)注我的簡(jiǎn)書賬戶: 張芳濤,我后期會(huì)發(fā)布更多...
    張芳濤閱讀 12,029評(píng)論 11 38
  • FFMPEG簡(jiǎn)介 FFmpeg的名稱來(lái)自MPEG視頻編碼標(biāo)準(zhǔn),前面的“FF”代表“Fast Forward”,F(xiàn)F...
    面試題小能手閱讀 1,591評(píng)論 1 3
  • 什么是FFmpeg FFmpeg 既是一款音視頻編解碼工具,同時(shí)也是一組音視頻編解碼開(kāi)發(fā)套件,作為編解碼開(kāi)發(fā)套件,...
    Damon_He閱讀 5,594評(píng)論 4 9
  • 喜歡旅行,喜歡冒險(xiǎn),喜歡自由,喜歡分享,喜歡與眾不同,喜歡有夢(mèng)為馬,喜歡把生命過(guò)成自己想要的模樣…就是這樣一個(gè)85...
    三生石19870閱讀 1,410評(píng)論 0 6

友情鏈接更多精彩內(nèi)容