函数原型:
int avformat_alloc_output_context2(AVFormatContext **ctx, const AVOutputFormat *oformat,
const char *format_name, const char *filename);
功能:
查找根据format_name或者filename或者oformat输出类型,并且初始化ctx结构。
参数:
ctx:AVFormatContext结构体,ffmpeg核心结构体,会在函数内部给ctx分配AVFormatContext空间并初始化。
oformat:指定输出格式的 AVOutputFormat 结构体指针。可以使用 NULL,此时将根据 format_name 自动选择输出格式。
format_name:输出格式名称
filename:输出文件/URL名称
返回值:
成功:0;失败:非0
工作流程:
1. 首先判断oformat是否为NULL:
2. 如果oformat不为NULL:
直接初始化ctx结构((*ctx)->oformat, 保存filename到(*ctx)->url);
如果oformat为NULL:
format_name不为NULL:会循环查找muxer_list结构成员的name成员是否与format_name相同;
filename不为NULL:会循环查找muxer_list结构成员的extensions成员与filename的后缀是否相同;
找到后初始化ctx结构((*ctx)->oformat, 保存filename到(*ctx)->url); 如果没找到的话释放分配的ctx空间,返回错误码!
有关muxer_list的信息参考后续代码;
注意:
那么会产生一个问题:如果format_name和filename都不为NULL呢?当然如果format_name = "flv"和filename="file.flv"这是没问题的,肯定找到同一个结构;那么如果format_name = "flv"和filename="file.mp4"呢?到底以谁为准呢?