BitStreamFilter(比特流滤波器)
一、 BitStreamFilter是干嘛用的
比特流滤波器对编码后的数据进行操作(压缩码流)。
不进行解码操作,但是支持比特流级别的修改。
二、 BitStreamFilter的使用场景
H.264码流分Annex-B和AVCC两种格式。
1. AVCC以长度信息分割NALU,在mp4和flv等封装格式中使用。
2. Annex-B以start code(0x000001或0x00000001)分割NALU,在mpegts流媒体文件中使用。
很多场景需要进行这两种格式之间的转换,FFmpeg提供了名称为h264_mp4toannexb 的Bitstream Filter(bsf)来实现这个功能。
三、 BitStreamFilter的使用方法
1、 初始化并申请空间
AVBSFContext *bsf_ctx;
AVBitStreamFilter *filter = av_bsf_get_by_name("aac_adtstoasc");
if(!filter)
{
av_log(NULL,AV_LOG_ERROR,"Unkonw bitstream filter");
}
int ret = av_bsf_alloc(filter, &bsf_ctx);
// 3 添加解码器属性
avcodec_parameters_copy(bsf_ctx->par_in, ifmt_ctx->streams[videoindex]->codecpar);
av_bsf_init(bsf_ctx);
2、使用
AVPacket pkt;
...
av_read_frame(ifmt_ctx, &pkt);
//把pkt数据推送到filter中去
ret = av_bsf_send_packet(bsf_ctx, &pkt);
if(ret < 0)
//推送失败,做异常处理
//获取处理后的数据,用同一个pkt
ret = av_bsf_receive_packet(bsf_ctx, &pkt);
if(ret < 0)
//读取失败,做异常处理
3、释放
av_bsf_free(&bsf_ctx);