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

版本记录

版本号 时间
V1.0 2017.12.31

前言

FFMPEG是一个多媒体转码、音视频流化传输的一个第三方开源框架,并且这个第三方库是基于C语言的。 iOS平台下的ffmpeg主要包括以下一些功能:影音的解码、编码、编码转换、混合、抽取、串流和滤镜

Overview

这是一个为iOS和tvOS应用程序构建FFmpeg库的shell脚本。

FFmpeg在Linux平台下开发,但它同样也可以在其它操作系统环境中编译运行,包括Windows、Mac OS X等。这个项目最早由Fabrice Bellard发起,2004年至2015年间由Michael Niedermayer主要负责维护。许多FFmpeg的开发人员都来自MPlayer项目,而且当前FFmpeg也是放在MPlayer项目组的服务器上。项目的名称来自MPEG视频编码标准,前面的"FF"代表"Fast Forward"

使用FFMPEG作为内核视频播放器:

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

使用FFMPEG作为内核的Directshow Filter:

ffdshow,lav filters...

使用FFMPEG作为内核的转码工具:

ffmpeg,格式工厂...

事实上,FFMPEG的视音频编解码功能确实太强大了,几乎囊括了现存所有的视音频编码标准,因此只要做视音频开发,几乎离不开它。

对于完全没有视音频技术背景的人来说,在学习FFmpeg之前最好先了解一下几种最基本的视音频数据的格式,可以参考下面的文章:

感兴趣的可以参考下面这个大神的博客,我看了下,他总结的很全面很深入,想要学习的话可以关注他,我这里列出来的很多参考文章,也是他写的或者他来出来的。

他的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发行版的二进制文件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. 官方网站
4. ffmpeg参数中文详细解释
5. ffmpeg.exe详细的使用说明英文
6. ffplay的快捷键以及选项
7. ffplay英文详细使用说明
8. ffprobe.exe英文详细使用说明

ffmpeg库的配置
1. 下载地址
2. FFMPEG 库移植到 VC 需要的步骤
3. 最简单的基于FFMPEG+SDL的视频播放器

视频播放器
1. 100行代码实现最简单的基于FFMPEG+SDL的视频播放器
2. 最简单的基于FFMPEG+SDL的视频播放器 ver2 (采用SDL2.0)
3. 最简单的基于FFmpeg的解码器-纯净版(不包含libavformat)
4. ffmpeg函数介绍
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行代码实现最简单的基于FFMPEG+SDL的视频播放器
3. 如何用FFmpeg编写一个简单播放器
4. ffplay的快捷键以及选项
5. ffplay_vc2005
6. ffplay播放器移植VC的工程:ffplay for MFC
7. ffplay for mfc 代码备忘
8. ffplay.c函数结构简单分析(画图)

编码

ffmpeg编码我自己研究的不是很多,可以参考文章:

上面那篇文章是用的类库比较旧,新版类库的的使用可以参考下面几篇文章。

上述编码器使用libavformat和libavcodec两个类库完成了视频的编码工作。实际上编码工作只需要libavcodec就可以了。因此更新了一个“纯净”的编码器。该编码器只使用libavcodec完成编码工作: 最简单的基于FFmpeg的编码器-纯净版(不包含libavformat)

转码

转码实际上是先解码然后编码。

不进行转码,只进行封装格式转换的程序可参考:最简单的基于FFMPEG的封装格式转换器(无编解码)
转码程序可参考:最简单的基于FFMPEG的转码程序
比较复杂的转码程序可以参考ffmpeg.c,它移植到MFC下的工程:ffmpeg转码器移植VC的工程:ffmpeg for MFC
ffmpeg.c函数结构简单分析:ffmpeg.c函数结构简单分析(画图)

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打开媒体的函数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源代码简单分析:日志输出系统(av_log()等)
FFmpeg源代码简单分析:结构体成员管理系统-AVClass
FFmpeg源代码简单分析:结构体成员管理系统-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解码器源代码简单分析:环路滤波(LoopFilter)部分

【解码-libavcodec HEVC 解码器】

FFmpeg的HEVC解码器源代码简单分析:概述
FFmpeg的HEVC解码器源代码简单分析:解析器(Parser)部分
FFmpeg的HEVC解码器源代码简单分析:解码器主干部分
FFmpeg的HEVC解码器源代码简单分析:CTU解码(CTUDecode)部分-PU
FFmpeg的HEVC解码器源代码简单分析:CTU解码(CTU Decode)部分-TU
FFmpeg的HEVC解码器源代码简单分析:环路滤波(LoopFilter)

后记

未完,待续~~~

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,825评论 4 377
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,887评论 2 308
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 112,425评论 0 255
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,801评论 0 224
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,252评论 3 299
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,089评论 1 226
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,216评论 2 322
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 31,005评论 0 215
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,747评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,883评论 2 255
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,354评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,694评论 3 265
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,406评论 3 246
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,222评论 0 9
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,996评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,242评论 2 287
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 36,017评论 2 281

推荐阅读更多精彩内容