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官網上是這麼說的:

大概的意思就是:轉碼成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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章