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;


ffmpeg流过滤器列表
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • FFmpeg 介绍 FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LG...
    Y了个J阅读 13,912评论 0 28
  • ### YUV颜色空间 视频是由一帧一帧的数据连接而成,而一帧视频数据其实就是一张图片。 yuv是一种图片储存格式...
    天使君阅读 8,836评论 0 4
  • 教程一:视频截图(Tutorial 01: Making Screencaps) 首先我们需要了解视频文件的一些基...
    90后的思维阅读 10,278评论 0 3
  • 一. 概述 苹果从iOS 8开始,开放了硬编码和硬解码的api,所以,从iOS 8开始,需要解码H.264视频时,...
    金山视频云阅读 13,475评论 1 25
  • 蝶恋花 磁铁般的芬芳 鱼游向大海 追逐梦的企及 风撩一个弧度 你为三十九度疯狂 落花飘在水里 留恋着赏花的人 路吸...
    云中飘舞阅读 2,299评论 40 54

友情链接更多精彩内容