3.1 FFmpeg 文件结构
- libavformat
主要存放 ffmpeg 支持的 各种编解码器 的实现及 ffmpeg 编解码 功能相关的数
文件 | 简要说明 |
---|---|
allcodecs.c | 简单的注册类函数 |
avcodec.h | 编解码相关结构体定义和函数原型声明 |
dsputil.c | 限幅数组初始化 |
dsputil.h | 限幅数组声明 |
imgconvert.c | 颜色空间转换相关函数实现 |
imgconvert_template.h | 颜色空间转换相关结构体定义和函数声明 |
utils_codec.c | 一些解码相关的工具类函数的实现 |
mpeg4audio.c | mpeg4 音频编解码器的函数实现 |
mpeg4audio.h | mpeg4 音频编解码器的函数声明 |
mpeg4data.h | mpeg4 音视频编解码器的公用的函数声明及数据结构定义 |
mpeg4video.c | mpeg4 视频编解码器的函数实现 |
mpeg4video.h | mpeg4 视频编解码器的函数的声明及先关数据结构的定义 |
mpeg4videodec.c | mpeg4 视频解码器的函数实现 |
mpeg4videoenc.c | mpeg4 视频编码器的函数实现 |
* libavformat
本目录主要存 放 FFMPEG 支持 的各种媒体格 式 MUXER/DEMUXER 和数据流协议 的定义和实现 文件以及 ffmpeg 解复用 相关的数据结 构及函数定义
文件 | 简要说明 |
---|---|
allformats.c | 简单注册类函数 |
avformat.h | 文件和媒体格式相关函数声明和数据结 构定义 |
avio.c | 无缓冲 IO 相关函数实现 |
avio.h | 无缓冲 IO 相关结构定义和函数声明 |
aviobuf.c | 有缓冲数据 IO 相关函数实现 |
cutils.c | 简单的字符串操作函数 |
utils_format.c | 文件和媒体格式相关的工具函数的实现 |
file.c | 文件 io 相关函数 |
…… | 其他相关媒体流 IO 的函数和数据结构实 现文件。 如:rtsp、http 等。 |
avi.c | AVI 格式的相关函数定西 |
avi.h | AVI 格式的相关函数声明及数据结构定义 |
avidec.c | AVI 格式 DEMUXER 相关函数定义 |
avienc.c | AVI 格式 MUXER 相关函数定义 |
…… | 其他媒体格式的 muxer/demuxer 相关函 数及数据结构定义和声明文件 |
*libavutil
主要存放 ffmpeg 工具类 函数的定义
avutil.h | 简单的像素格式宏定义 |
---|---|
bswap.h | 简单的大小端转换函数的实现 |
commom.h | 公共的宏定义和简单函数的实现 |
mathematics.c | 数学运算函数实现 |
rational.h | 分数相关表示的函数实现 |
3.2 I\O 模块分析
3.2.1 概述
ffmpeg 项目的数据 IO 部分主要是在 libavformat 库中实现, 某些对于内存的操作部分在 libavutil 库中。数据 IO 是基于文件格式(Format)以及文件传输协议(Protocol) 的, 与具体的编解码标准无关。 ffmpeg 工程转码时数据 IO 层次关系如图所示:
对于上面的数据 IO 流程, 具体可以用下面的例子来说明, 我们从一个 http 服务器 获取音视频数据, 格式是 flv 的, 需要通过转码后变成 avi 格式, 然后通过 udp 协议进 行发布。 其过程就如下所示:
* 1、读入 http 协议数据流, 根据 http 协议获取真正的文件数据(去除无关报文信 息);
* 2、根据 flv 格式对数据进行解封装;
* 3、读取帧进行转码操作;
* 4、按照目标格式 avi 进行封装;
* 5、通过 udp 协议发送出去。
3.2.2 相关数据结构介绍
在 libavformat 库中与数据 IO 相关的数据结构主要有 URLProtocol、URLContext、ByteIOContext、AVFormatContext 等, 各结构之间的关系如图所示。
1、URLProtocol 结构
表示广义的输入文件, 该结构体提供了很多的功能函数, 每一种广义的输入文件 (如:file、pipe、tcp、rtp 等等)对应着一个 URLProtocol 结构,在 av_register_all() 中将该结构体初始化为一个链表, 表头为 avio.c 里的 URLProtocol *first_protocol = NULL;保存所有支持的输入文件协议, 该结构体的定义如下:
typedef struct URLProtocol
{
const char *name;
int (*url_open)(URLContext *h, const char *url, int flags);
int (*url_read)(URLContext *h, unsigned char *buf, int size);
int (*url_write)(URLContext *h, const unsigned char *buf, int size);
int64_t (*url_seek)(URLContext *h, int64_t pos, int whence);
int (*url_close)(URLContext *h);
struct URLProtocol *next;
int (*url_read_pause)(URLContext *h, int pause);
int64_t (*url_read_seek)(URLContext