FFMPEG Learnning:how to get a correct bsf_filtter for your packet which arm to send to decoder

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

为视频帧获取“解析头”,以便decoder能够用之正确解码

一、BitStreamFilter 类型汇总列表
FFmpeg Unity Documentory Website
Introduction of Some filters
在这里插入图片描述二、获取正确的BitStreamFilter 方式

  1. 指定标签获取:
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; 
}
  1. 迭代自获取,关键函数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;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值