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)

后记

未完,待续~~~

推荐阅读更多精彩内容