一、流程图
二、结构体
1 .AVOutputFormat
一、核心功能与作用
-
封装格式描述
AVOutputFormat
保存了输出容器格式的元数据,包括:- 短名称(
name
):如flv
、mp4
; - 易读名称(
long_name
):如FLV (Flash Video)
; - MIME类型(
mime_type
):如video/x-flv
; - 文件扩展名(
extensions
):如flv
。
- 短名称(
-
默认编码格式设置
指定音视频流的默认编码格式ID(如audio_codec
和video_codec
),例如FLV默认音频编码为MP3,视频编码为FLV1。 -
操作函数接口
定义封装过程中的关键函数指针,包括:write_header
:写入文件头部;write_packet
:写入数据包;write_trailer
:写入尾部信息。
-
链表存储
FFmpeg将所有支持的AVOutputFormat
实例以链表形式存储,便于动态查找和管理。
二、结构体关键字段解析
typedef struct AVOutputFormat {
const char *name; // 格式短名称(如"flv")
const char *long_name; // 易读全称
const char *mime_type; // MIME类型
const char *extensions; // 文件扩展名
enum AVCodecID audio_codec; // 默认音频编码ID
enum AVCodecID video_codec; // 默认视频编码ID
int flags; // 控制封装行为的标志位
const struct AVCodecTag **codec_tag; // 支持的编码器标签列表
struct AVOutputFormat *next; // 链表指针
int priv_data_size; // 私有数据大小
// 函数指针(如write_header、write_packet等)
} AVOutputFormat;
三、 重要字段说明:
-
flags
标志位
控制封装行为,例如:AVFMT_GLOBALHEADER
:要求编码器生成全局头(如H.264的SPS/PPS);AVFMT_VARIABLE_FPS
:允许可变帧率封装,适用于直播流。
-
codec_tag
编码器标签
定义支持的编码器列表,按优先级排序,用于匹配最佳编码器。 -
priv_data_size
私有数据
存储格式特定的上下文信息(如FLV的FLVContext
),用于自定义参数。
四、使用场景与示例
1. 获取输出格式
通过文件名或扩展名查找支持的封装器:
AVOutputFormat *fmt = av_guess_format("flv", NULL, NULL); // 获取FLV封装器
2. 初始化封装上下文
将AVOutputFormat
绑定到AVFormatContext
:
AVFormatContext *oc = NULL;
avformat_alloc_output_context2(&oc, fmt, NULL, "output.flv"); // 关联格式并分配上下文
3. 自定义封装器实现
以FLV为例,需实现关键函数接口:
AVOutputFormat ff_flv_muxer = {
.name = "flv",
.long_name = "FLV (Flash Video)",
.priv_data_size = sizeof(FLVContext), // 私有上下文
.audio_codec = AV_CODEC_ID_MP3,
.video_codec = AV_CODEC_ID_FLV1,
.write_header = flv_write_header, // 自定义头部写入
.write_packet = flv_write_packet, // 数据包写入逻辑
};
五、与其他组件的关系
-
AVFormatContext
AVOutputFormat
作为其oformat
成员,驱动封装流程。 -
AVCodecContext
通过audio_codec
和video_codec
关联默认编码器参数,影响流配置。 -
私有数据(如
FLVContext
)
存储格式特定的上下文信息,例如FLV的元数据或时间戳处理逻辑。