老版本:

//声明:    
AVBitStreamFilterContext* h264bsfc =  av_bitstream_filter_init("h264_mp4toannexb"); 
//使用
av_bitstream_filter_filter(h264bsfc, in_stream->codec, NULL, &pkt.data, &pkt.size, pkt.data, pkt.size, 0);
//释放:
av_bitstream_filter_close(h264bsfc);  

新版本:


//声明  
AVBSFContext *bsf_ctx = nullptr;
const AVBitStreamFilter *pfilter = av_bsf_get_by_name("h264_mp4toannexb");
av_bsf_alloc(pfilter, &bsf_ctx);
//使用:
av_bsf_send_packet(bsf_ctx, &packet);
av_bsf_receive_packet(bsf_ctx, &packet);
//释放:
av_bsf_free(&bsf_ctx);

h264有两种封装,一种是annexb模式,传统模式,有startcode(0x000001或0x0000001)分割NALU,在mpegts流媒体中使用,vlc里打开编码器信息中显示h264;

一种是AVCC模式,一般用mp4、mkv、flv容器封装,以长度信息分割NALU, vlc里打开编码器信息中显示avc1。

很多场景需要进行这两种格式之间的转换,FFmpeg提供了名称为h264_mp4toannexb的Bitstream Filter(bsf)来实现这个功能。

例如将mp4转换成h264可使用如下指令:

mp4->h264:sudo ffmpeg -i test.mp4 -codec copy -bsf: h264_mp4toannexb -f h264 test.h264

bsf的使用方法:

(1)使用查询函数av_bsf_get_by_name 根据名称查找对应的AVBitstreamFilter。

(2)使用av_bsf_alloc为AVBSFContext和他的一些内部变量分配内存。

(3)设置AVBSFContext可能需要使用一些变解码参数和time_base[2].

(4)在设置好参数之后使用av_bsf_init来初始化bsf.

(5)使用av_bsf_send_packet函数输入数据,并使用av_bsf_receive_packet获得处理后的输出数据。

(6)处理结束后,av_bsf_free清理用于上下文和内部缓冲区的内存。

本文链接地址:https://const.net.cn/818.html

标签: ffmpeg

添加新评论