专栏首页曾大稳的博客ffmpeg为AVPacket添加解码头信息

ffmpeg为AVPacket添加解码头信息

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

主要使用的类AVBitStreamFilter

添加过程:

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;

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • ffmpeg添加水印和滤镜效果

    更多的特效使用: http://www.ffmpeg.org/ffmpeg-filters.html

    曾大稳
  • Android使用libRtmp直播推流

    具体查看demo: https://github.com/ChinaZeng/RtmpLivePushDemo

    曾大稳
  • ffmpeg 视频解码h264和yuv

    之前学习 ffmpeg 在 android 平台上,发现很不方便,所以打算在 vs 上重新搭建环境,然后重新学习,之后如果需要用到的话在移植到其他平台。环境搭建...

    曾大稳
  • MySQL数据库5事务、视图、触发器、函数、数据库的备份

    事务指一组操作要么成功要么失败,在成功修改数据前原来的数据不会受影响,如果修改成功则数据将被更改,如果失败,则原数据库数据不变。

    GH
  • 为什么2015年将是云计算快速成长的一年

    在2014年以前,云计算主要还是开发商和网站的所有者对这一领域比较感兴趣,但如今他已经成为任何企业的IT占率中重要的工具或组成部分。其能够提高业务的敏捷性,同时...

    静一
  • 世界杯大数据揭秘不眠的北上广深

    2018俄罗斯世界杯终于完美落幕了,相信有不少球迷已经变为“夜店”达人。不管你是为比赛本身,还是为球星,为颜值,为热闹,如果你没有在世界杯的夜晚感受过一群人的狂...

    DT数据侠
  • varnish 3 telnet 认证

    telnet 连接varnish服务器,管理varnish,纠结了很久。一直报错~~

    py3study
  • 蛋白质组学第4期 文章搜库过程复现

    上周我们公布了,蛋白质组学习小组起飞啦! 短短几天就获得了250多小伙伴的支持,让我们也更有信心的带领大家掌握一个蛋白质组学数据处理的实战,前面两期我们分享的...

    生信技能树
  • SpringCloud微服务:Sentinel哨兵组件,管理服务限流和降级

    Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。包括核心的独立类库,监控台,丰富的使用场景验证。(这似乎是阿里开...

    知了一笑
  • 【腾讯云的1001种玩法】十分钟轻松搞定云架构之一 :从上云开始

    本文是 【十分钟轻松搞定云架构】的第一节:从上云开始,从这节开始,我们来一起学习云端架构。

    白宦成

扫码关注云+社区

领取腾讯云代金券