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

版本記錄

版本號 時間
V1.0 2017.12.31

前言

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

Overview

這是一個為iOS和tvOS應用程序構建FFmpeg庫的shell腳本。

FFmpeg在Linux平臺下開發(fā),但它同樣也可以在其它操作系統(tǒng)環(huán)境中編譯運行,包括Windows、Mac OS X等。這個項目最早由Fabrice Bellard發(fā)起,2004年至2015年間由Michael Niedermayer主要負責維護。許多FFmpeg的開發(fā)人員都來自MPlayer項目,而且當前FFmpeg也是放在MPlayer項目組的服務器上。項目的名稱來自MPEG視頻編碼標準,前面的"FF"代表"Fast Forward"。

使用FFMPEG作為內核視頻播放器:

Mplayer,ffplay,射手播放器,暴風影音,KMPlayer,QQ影音...

使用FFMPEG作為內核的Directshow Filter:

ffdshow,lav filters...

使用FFMPEG作為內核的轉碼工具:

ffmpeg,格式工廠...

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

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

感興趣的可以參考下面這個大神的博客,我看了下,他總結的很全面很深入,想要學習的話可以關注他,我這里列出來的很多參考文章,也是他寫的或者他來出來的。

他的CSDN - 博客


相關結構體的研究

ffmpeg的結構體之間的關系參考文章

結構體中每個變量的分析,參考文章:


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ā)行版的二進制文件https://downloads.sourceforge.net/project/ffmpeg-ios/ffmpeg-ios-master.tar.bz2


External libraries - 外部鏈接庫

你應該加下面的庫

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

Influences

參考文章

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

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

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

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

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

編碼

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

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

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

轉碼

轉碼實際上是先解碼然后編碼。

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

ffmpeg源代碼分析

【架構圖】

FFmpeg源代碼結構圖 - 解碼
FFmpeg源代碼結構圖 -編碼

【通用】

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

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

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

【其它】

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

【腳本】

FFmpeg源代碼簡單分析:makefile
FFmpeg源代碼簡單分析:configure

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

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

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

【解碼-libavcodec HEVC 解碼器】

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

后記

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

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

相關閱讀更多精彩內容

友情鏈接更多精彩內容