ffmpeg关于h264编码提示h264_mp4toannexb的问题

MP4的视频H264封装有2种格式:h264和avc1


AVC1 描述:H.264 bitstream without start codes.一般通过ffmpeg转码生成的视频,是不带起始码0x00000001的。
H264 描述:H.264 bitstream with start codes.一般对于一下HDVD等电影的压制格式,是带有起始码0x00000001的。


如何区分呢,网上有好多一模一样的帖子都说是比较pkt.data头4个字节是否是0x00000001,实际上h264的NAL有两种,即:0x00000001或0x000001,还有首帧的pkt.data不是0x00000001,但第二帧开始就是0x00000001,后面还有0x000001的情况,所以判断头也不靠谱。
本人通过比较两种文件中in_stream->codec发现在AVC1模式时in_stream->codec->codec_tag = 0x31637661,翻译成字符串就是"1cva",这个codec_tag是int型,那么内存中的值应该是:0x61 0x76 0x63 0x31,也主是"avc1",而且输出流out_stream->codec->code_id = AV_CODEC_ID_H264时,这个out_stream->codec->code_tag的值是0x34363248,在内存中就是"H264",所以没错就是用这个字段来判断了。
is_annexb = false;
AVPacket pkt = {0};
const char start_code[4] = { 0, 0, 0, 1 };
//判断H264的NAL是否需要annexb过滤(读个几帧,看看头数据是否是0x00000001,若全都不是,则需要annexb过滤)
if(in_stream->codec->codec_id == AV_CODEC_ID_H264)
{
	if(in_stream->codec->codec_tag == 0x31637661)//avc1
		is_annexb = true;
	else
	{
		int n = 0, t = 0;
		while(n < 5)
		{
			n++;
			ret = av_read_frame(ifmt_ctx, &pkt);
			if(ret < 0)
				continue;
			if(memcmp(pkt.data, start_code, 4) == 0)
				t++;
			av_packet_unref(&pkt);
		}
		if(t==0)
			is_annexb = true;
		av_seek_frame(ifmt_ctx, vid, 0, AVSEEK_FLAG_BYTE);//重定位到第0帧
	}
}


  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值