关闭

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

1261人阅读 评论(0) 收藏 举报
分类:
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成员获取。

1
0
查看评论

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

ffmpeg3.3新版本AVStream的封装流参数由codec替换codecpar(解码)原创夏曹俊2017-08-24 10:34:13评论(0)297人阅读ffmpeg新版本中(封装流)AVStream的codec参数要被codecpar参数所替代,这样替代我们要注意什么,为什么要替代,我们先...
  • jacke121
  • jacke121
  • 2018-02-11 17:14
  • 31

用AVCodecParameters代替AVCodecContext

AVCodecParameters使用在高版本的ffmpeg库中使用AVStream::codec成员时,编译和运行时都出现一堆警告:
  • luotuo44
  • luotuo44
  • 2017-02-16 00:12
  • 3301

FFMPEG AVCodecparameter 怎么用?

FFMPEG AVCodecparameter  怎么用?        最近在研究FFMPEG 于是下载啦一个最新的2017年5月23号的ffmpeg 3.3.1。新版本的FFMpeg支持很多CUDA cuvid 等等,编码器,解码器,硬件加速等,...
  • ILOVEYOULEEHUIJIE
  • ILOVEYOULEEHUIJIE
  • 2017-05-27 09:48
  • 1058

4——FFMPEG之流对象----AVStream

从多媒体播放器基础知识中知道,解复用器的目的就是
  • finewind
  • finewind
  • 2014-10-11 22:00
  • 3934

将音频流解码为pcm(with avformat)

#include "stdafx.h" extern "C" { #include "libavformat\avformat.h" }; int main(int argc, char* argv[]) { AVFormatCo...
  • u013699869
  • u013699869
  • 2016-01-06 16:32
  • 371

AVStream介绍

1.       AVStream概览 AVStream是一款微软提供的多媒体类驱动程序,它既支持单独的视频流媒体,也支持音频视频集成的流媒体。微软把AVStream作为操作系统的一部分,在驱动程序ks.sys中导出。硬件供应商只需要编写...
  • kenn1117
  • kenn1117
  • 2017-05-04 18:19
  • 223

FFmpeg新旧接口对照使用笔记

现在看到的很多FFmpeg讲解实例,其中的代码大多数都是比较老旧的,特别是在一些基本用法上,学习使用时编译会看见很多的warning,类似“ warning: ‘AVStream::codec’ is deprecated (declared at /usr/local/ffmpeg/include...
  • zhangwu1241
  • zhangwu1241
  • 2016-11-16 10:36
  • 2222

FFMPEG结构体分析:AVStream

FFMPEG有几个最重要的结构体,包含了解协议,解封装,解码操作,此前已经进行过分析: FFMPEG中最关键的结构体之间的关系 在此不再详述,其中AVStream是存储每一个视频/音频流信息的结构体。本文将会分析一下该结构体里重要变量的含义和作用。 首先看一下结构体的定义(位于avformat.h文...
  • leixiaohua1020
  • leixiaohua1020
  • 2013-11-10 00:02
  • 32700

FFMPEG的AVFormatContext、AVStream、AVPacket、AVFrame时间戳分析

这里FFMPEG版本用的3.3.3时间戳描述 AVFormatContext /** * Duration of the stream, in AV_TIME_BASE fractional * seconds. Only set this value if you know non...
  • H514434485
  • H514434485
  • 2017-08-27 13:13
  • 294

ffmpeg之如何获得一个媒体文件的AVStream,并从该基础上获得AVCodec,AVCodecContext

#include #include extern "C"{ #include #include #include } #pragma comment(lib,"avcodec.lib") #pragma comment(lib...
  • u014660247
  • u014660247
  • 2016-12-05 16:16
  • 318
    我的视频课程
    C++QT5跨平台界面编程原理和实战大全
    C++编程FFMpeg实时美颜直播推流实战-基于ffmpeg,qt5,opencv视频课程
    屏幕录像机
    学习OpenCV3.2+QT5+ffmpeg实战开发视频编辑器视频教程
    基于FFmpeg和QT开发视频播放器
    C++socket网络编程大全实战http服务器(支持php)
    Lua与c++交互实战
    基于FFmpeg和QT开发视频播放器 多线程实战
    个人资料
    • 访问:69485次
    • 积分:880
    • 等级:
    • 排名:千里之外
    • 原创:25篇
    • 转载:68篇
    • 译文:0篇
    • 评论:16条
    最新评论