前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ffmpeg为AVPacket添加解码头信息

ffmpeg为AVPacket添加解码头信息

作者头像
曾大稳
发布2018-09-11 10:54:00
6.4K0
发布2018-09-11 10:54:00
举报
文章被收录于专栏:曾大稳的博客曾大稳的博客

FFmpeg解码获得的AVPacket只包含视频压缩数据,并没有包含相关的解码信息 (比如:h264的sps pps头信息,AAC的adts头信息),没有这些编码头信息解 码器(MediaCodec)是识别不到不能解码的。在FFmpeg中,这些头信息是保存 在解码器上下文(AVCodecContext)的extradata中的,所以我们需要为每一种 格式的视频添加相应的解码头信息,这样解码器(MediaCodec)才能正确解析 每一个AVPacket里的视频数据。

主要使用的类AVBitStreamFilter

添加过程:

代码语言:javascript
复制

const AVBitStreamFilter *absFilter = NULL;
AVBSFContext *absCtx = NULL;
AVCodecParameters *codecpar = NULL;

//1. 找到相应解码器的过滤器
if(strcasecmp(codecName, "h264") == 0){
    absFilter = av_bsf_get_by_name("h264_mp4toannexb");
}else if(strcasecmp(codecName, "h265") == 0){
    absFilter = av_bsf_get_by_name("hevc_mp4toannexb");
}

//2.过滤器分配内存
av_bsf_alloc(absFilter,absCtx)

//3. 添加解码器属性
if(pFormatCtx->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO){
    codecpar = pFormatCtx->streams[i]->codecpar;
}
avcodec_parameters_copy(absCtx->par_in, codecpar);

//4. 初始化过滤器上下文
av_bsf_init(absCtx);

//5. AVPacket处理
if(av_bsf_send_packet(absCtx, avPacket) != 0){
    av_packet_free(&avPacket);
    av_free(avPacket);
    avPacket = NULL;
    continue;
}
while(av_bsf_receive_packet(absCtx, avPacket) == 0){
    LOGE("开始解码");
    av_packet_free(&avPacket);
    av_free(avPacket);
    continue;
}
avPacket = NULL;

//6. 释放资源
av_bsf_free(&absCtx);
absCtx = NULL;
ffmpeg流过滤器列表
ffmpeg流过滤器列表
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-07-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档