ffmpeg中h264_mp4toannexb使用说明及注意事项

本文借鉴于:https://blog.csdn.net/amazing_yangle/article/details/49029687

首先解释一下h264_mp4toannexb是做什么用的:

h264有两种封装,
一种是annexb模式,传统模式,有startcode,SPS和PPS是在ES中,vlc里打开编码器信息中显示h264;
一种是mp4模式,一般mp4 ,mkv会有,没有startcode,SPS和PPS以及其它信息被封装在container中,每一个frame前面是这个frame的长度,vlc里打开编码器信息中显示avc1。
很多解码器只支持annexb这种模式,因此需要将mp4做转换。

还有就是什么时候使用:

ffmpeg官网上是这么说的:

ffmpeg中h264_mp4toannexb使用说明及注意事项_第1张图片

大概的意思就是:转码成TS格式文件需要使用此项。(英文好的可以自己翻译一下)

所以如果是MP4文件转码成MP4文件完全没必要使用它。

 

在代码中如何使用:

初始化、过滤、释放关闭,具体代码如下,

初始化:

AVBitStreamFilterContext *h264bsfc;

if (ifmt_ctx->streams[i]->codec->codec_id == AV_CODEC_ID_H264) 
{
	/*这里注意:"h264_mp4toannexb",一定是这个字符串*/
	h264bsfc = av_bitstream_filter_init("h264_mp4toannexb");
	if (h264bsfc == NULL)
	{
		printf("H264 mp4 to annexb失败!\n");
		return;
	}
}

使用时一定要注意,不然容易造成内存泄漏:

AVPacket pkt;
AVPacket TmpPkt;

// 读一包数据
if ((av_read_frame(ifmt_ctx, &pkt)) < 0)
{
	printf("av_read_frame() error!\n");
	break;
}

if (nVideoIndex == pkt.stream_index && h264bsfc != NULL)
{
	uint8_t *out_data = NULL;
	int out_size = 0;

	int a = av_bitstream_filter_filter(h264bsfc,
		ofmt_ctx->streams[pkt.stream_index]->codec, NULL, &out_data, &out_size,
		pkt.data, pkt.size, pkt.flags & AV_PKT_FLAG_KEY);

	av_init_packet(&TepPkt);
	av_packet_copy_props(&TmpPkt, &pkt);
	av_packet_from_data(&TmpPkt, out_data, out_size);
	TmpPkt.size = out_size;

	av_packet_unref(&pkt);
	av_copy_packet(&pkt, &TmpPkt);

	av_packet_unref(&TmpPkt);
}

释放:

if (h264bsfc != NULL)
{
	av_bitstream_filter_close(h264bsfc);
	h264bsfc = NULL;
}

 

你可能感兴趣的:(FFmpeg,视音频,ffmpeg)