ffmpeg3.3新版本AVStream的封装流参数由codec替换codecpar(解码)

原创 2017年08月24日 10:19:52
ffmpeg新版本中(封装流)AVStream的codec参数要被codecpar参数所替代,这样替代我们要注意什么,为什么要替代,我们先来看下ffmpeg的代码。
代码分析和新参数优势
typedef struct AVStream {
#if FF_API_LAVF_AVCTX
/**
* @deprecated use the codecpar struct instead
*/
attribute_deprecated
AVCodecContext *codec;
#endif
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
/*
* Codec parameters associated with this stream. Allocated and freed by
* libavformat in avformat_new_stream() and avformat_free_context()
* respectively.
*
* - demuxing: filled by libavformat on stream creation or in
* avformat_find_stream_info()
* - muxing: filled by the caller before avformat_write_header()
*/
AVCodecParameters *codecpar;
}
从代码中我们可以看出codec参数在58版本及之后就不会支持了,需要由codecpar参数所替代。这样做的目的我想主要是将编码和封装彻底分离,之前封装和编码使用的参数都是存放在codec中,这样的好处是代码简洁,不需要额外给封装传递参数,但坏处是把编码和封装的代码融合在一块耦合性较大,有很多需求,我们只需要编码并不需要做封装,比如我们做自己的推流协议,直接吧编码后h264数据通过自定义的协议发送。
再比如直播推流中我们编码和封装推流会在不同的线程中处理,如果共用一个上下文肯定还需要处理互斥问题,分开就不会存在这个问题。
既然必须要替换我们如何处理;
比如原来的视频播放处理方式是这样(错误处理省略):
//打开多媒体文件,我们假定视频流索引为0
AVFormatContext *ic = NULL;
avformat_open_input(&ic, "test.mp4", 0, 0);
//找到视频解码器,比如H264
  AVCodec *codec = avcodec_find_decoder(ic->streams[0]->codec->codecid);
  //打开视频解码器,打开音频解码器用的也是同一个函数
avcodec_open2(enc, ic->streams[0]->codec, NULL);
看代码我们知道avformat_open_input之后音视频的配置信息已经被写在了codec中,解封装和解码用同一套参数。但是如果替换为codecpar ,那解码器是独立创建的,那是否还要手动填写一遍解码参数,理论上是需要的,不过还好ffmpeg提供给我们一个函数做参数复制
int avcodec_parameters_to_context(AVCodecContext *codec, const AVCodecParameters *par);
那我们codec参数替换为codecpar 代码就可以这样写了(错误处理省略)
//打开多媒体文件,我们假定视频流索引为0
AVFormatContext *ic = NULL;
avformat_open_input(&ic, "test.mp4", 0, 0);
//找到视频解码器,比如H264
  AVCodec *codec = avcodec_find_decoder(ic->streams[0]->codecpar->codec_id);
//独立的解码上下文
AVCodecContext * vc = avcodec_alloc_context3(codec);
avcodec_parameters_to_context(vc, ic->streams[0]->codecpar);
avcodec_open2(vc, codec, NULL);
代码改变后解码上下文就是独立的,后面解码也不需要与解封装上下文关联,包括清理。
解码器的ID号也变为从codecpar->codec_id成员获取。

更多的资料也可以关注我csdn上的视频课程
夏老师课程专栏http://edu.csdn.net/lecturer/961

C++编程FFMpeg实时美颜直播推流实战-基于ffmpeg,qt5,opencv视频课程

C++编程FFMpeg实时美颜直播推流实战-基于ffmpeg,qt5,opencv视频课程



版权声明:本文为博主夏曹俊原创文章,未经博主允许不得转载。

相关文章推荐

C/C++音视频库ffmpeg的数据包AVPacket分析

C/C++音视频库ffmpeg的数据包AVPacket分析 AVPacket是ffmpeg用来存放编码后的视频帧数据,我们来分析一下这个结构体,int64_t pts; 本帧数据显示的时间,比较关键的...

终身会员卡上线三重大优惠!

今天是最值得庆贺的一个好日子,因为许多朋友热切期待的,我在51CTO学院上的终身会员卡终于正式上线了!!三重大优惠只限三天!!...
  • lycb_gz
  • lycb_gz
  • 2014年07月29日 08:26
  • 4896

MPEG2解码源码,新版本

  • 2014年09月07日 01:56
  • 199KB
  • 下载

新版本ffmpeg在Visual Studio中的使用。

FFMpeg是跨平台的开源软件,但是由于采用C99语法,在Visual Studio中无法编译,对于想要使用ffmpeg而不想去配置MinGw和其他依赖库的同学,提供以下方案。 首先去:http:/...

ffmpeg编译 (3.3版本) 以及 命令行工具的集成

详细的说明请参考资源文件: http://download.csdn.net/detail/feixiangsmile/9827932?locationNum=9&fps=1 此文件主要内容为...

ffmpeg3.3 编译 android 系统版本 32位 和64 位 动态库

下载ffmpeg最新版本,修改configure文件 diff --git a/configure b/configure index 23823e3..8e6921a 100755 --- a/c...
  • coloriy
  • coloriy
  • 2017年06月02日 10:57
  • 552

ffmpeg H264解码 版本2.2 源码及实现

  • 2015年09月02日 19:40
  • 18.52MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ffmpeg3.3新版本AVStream的封装流参数由codec替换codecpar(解码)
举报原因:
原因补充:

(最多只允许输入30个字)