为视频帧获取“解析头”,以便decoder能够用之正确解码
一、BitStreamFilter 类型汇总列表
FFmpeg Unity Documentory Website
Introduction of Some filters
二、获取正确的BitStreamFilter 方式
- 指定标签获取:
const AVBitStreamFilter* pBitStreamFilter = av_bsf_get_by_name("h264_mp4toannexb");//"hevc_mp4toannexb"
函数源代码段:
const AVBitStreamFilter *av_bsf_get_by_name(const char *name)
{
int i;
for (i = 0; bitstream_filters[i]; i++)
{
const AVBitStreamFilter *f = bitstream_filters[i];
if (!strcmp(f->name, name)) return f;
}
return NULL;
}
- 迭代自获取,关键函数av_bsf_next
(1)
//代码段说明:遍历FFmpeg提供的所有BitStreamFilter
void *state = NULL;
const AVBitStreamFilter *bsf;
while (bsf = av_bsf_next(&state))
{
av_log(NULL, AV_LOG_INFO, "%s\n", bsf->name);
}
av_log输出结果,结果为**有效指定标签**,可用于指定标签获取filter:

(2)
//查看 AVBitStreamFilter的结构
//发现其包含 const enum AVCodecID *codec_ids;变量
//即可用codec_id条件对比,去终止搜索Filter,找到本视频流对应的filter
//本代码段,测试“指定标签”的Filter对应的codec_id指针转化成Int,输出查看,转换结果正确
void *state = NULL;
const AVBitStreamFilter *bsf;
while ((bsf = av_bsf_next(&state)))
{
av_log(NULL, AV_LOG_INFO, "%s\n", bsf->name);
if(bsf->codec_ids) av_log(NULL, AV_LOG_INFO, "%d\n", static_cast<int>(*bsf->codec_ids));
}
//存在的隐患:使用codec_id作为条件查找,同一个codec_id发现不同的Filter。见下图
运行结果,部分截图:
它们之间的不同是(红色箭头)?

(3)
//待续:如何根据视频帧的信息,自识别和获取AVBitStreamFilter类型
(4)
函数源代码段:
const AVBitStreamFilter *av_bsf_next(void **opaque)
{
uintptr_t i = (uintptr_t)*opaque;
const AVBitStreamFilter *f = bitstream_filters[i];
if (f) *opaque = (void*)(i + 1);
return f;
}

本文详细介绍了FFmpeg中BitStreamFilter的使用方法,包括如何通过指定标签或迭代方式获取BitStreamFilter,以及如何根据视频帧信息自识别并获取对应的BitStreamFilter类型,对视频解码和处理具有重要指导意义。
1639

被折叠的 条评论
为什么被折叠?



