FFMPEG完美入门资料---003---FFmpeg 架构

本文详细介绍了FFmpeg的文件结构,包括libavformat、libavutil库的作用。接着深入分析了FFmpeg的数据I/O模块,讲解了URLProtocol、URLContext和AVIOContext等关键数据结构及其相互关系,以及在数据IO流程中的作用。同时,概述了Demuxer和muxer模块,以及Decoder/Encoder模块,强调了AVCodecContext在编解码过程中的重要性。
摘要由CSDN通过智能技术生成

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 层次关系如图所示: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 等, 各结构之间的关系如图所示。
libavformat 库中 IO 相关数据结构之间的关系

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 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值