AVCodecContext 
AVCodecContext 结构表示程序运行的当前 Codec 使用的上下文,着重于所有 Codec 共有的属性(并且是在程序运行时才能确定其值)和关联其他结构的字段。
  • extradata 和 extradata_size 两个成员表述了相应 Codec 使用的私有数据;
  • codec成员关联相应的编解码器;
  • priv_data 成员关联各个具体编解码器独有的属性 context,与 AVCodec 结构中的 priv_data_size 配对使用。
  1. typedef struct AVCodecContext
  2. {
  3. enum AVMediaType codec_type; /* see AVMEDIA_TYPE_xxx */
  4. const struct AVCodec *codec; //指向相应的解码器,如: ff_h264_decoder
  5. enum AVCodecID codec_id; /* see AV_CODEC_ID_xxx */
  6. void *priv_data;//指向具体相应的解码器的 context,如 H264Context
  7.  
  8. int bit_rate;
  9. int frame_number;
  10.  
  11. int thread_count; //编解码时的线程数量,由用户设置,与CPU核心数有关,最佳效果一般设置为CPU核心数*2.
  12.  
  13. AVRational time_base; //时间的基准单位
  14.  
  15. unsigned char *extradata;//扩展数据,如 mov 格式-> audio trak ->aac -> esds 格式中的附加解码信息、H.264解码器的存储SPS,PPS信息等.
  16.  
  17. int extradata_size;//扩展数据的 size
  18.  
  19. int width, height; //视频的原始的宽度与高度,仅针对视频
  20.  
  21. enum PixelFormat pix_fmt;//视频一帧图像的格式,如 YUV420
  22.  
  23. int sample_rate; //采样率(仅音频)。
    int channels; //声道数(仅音频)。
    enum AVSampleFormat sample_fmt; //音频采样格式,编码:由用户设置。解码:由libavcodec设置。
    int frame_size; //音频帧中每个声道的采样数。编码:由libavcodec在avcodec_open2()中设置。 解码:可以由一些解码器设置以指示恒定的帧大小.
    int frame_number; //帧计数器,由libavcodec设置。解码:从解码器返回的帧的总数。编码:到目前为止传递给编码器的帧的总数。
    uint64_t channel_layout; //音频声道布局。编码:由用户设置。解码:由用户设置,可能被libavcodec覆盖。
    enum AVAudioServiceType audio_service_type; //音频流传输的服务类型。编码:由用户设置。解码:由libavcodec设置。
  24. int bits_per_sample;
  25. int block_align;
  26.  
  27. //公共操作函数
  28. int (*alloc_frame)(AVCodecContext *avctx, AVFrame *frame);
  29. int (*start_frame)(AVCodecContext *avctx, const uint8_t *buf, uint32_t buf_size);
  30. int (*decode_params)(AVCodecContext *avctx, int type, const uint8_t *buf, uint32_t buf_size);
  31. int (*decode_slice)(AVCodecContext *avctx, const uint8_t *buf, uint32_t buf_size);
  32. int (*end_frame)(AVCodecContext *avctx);
  33. }AVCodecContext;

其中codec成员结构体为AVCodec.

AVCodec
AVCodec 是类似 COM 接口的数据结构,表示音视频编解码器,着重于功能函数.
  • next 成员用于把所有支持的编解码器连接成链表,便于遍历查找;
  • id 确定唯 一编 解 码器 ;
  • priv_data_size 表示具 体 的 Codec 对应的 Context 结构大 小 .
  1. typedef struct AVCodec
  2. {
  3.  
  4. const char *name;// 标示 Codec 的名字, 比如, "h264" "h263" 等。
  5. const char *long_name; //表示Codec的长名字,比如h264的长名字为"H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10"
  6. enum AVMediaType type; // 标示 Codec 的类型,有 video , audio ,字幕等类型。
  7. enum AVCodecID id; // 标示 Codec 的 ID,有 AV_CODEC_ID_H264等。
  8.  
  9. int priv_data_size; // 标示具体的 Codec 对应的 Context 的 size,比如h264的等于sizeof(H264Context)
  10.  
  11. struct AVCodec *next; //以链表的形式指向下一个Codec(ID+1)
  12.  
  13. // 以下标示 Codec 对外提供的操作,每一种解码器都会实现这些操作。
  14. int(*init)(AVCodecContext*);
  15. int(*encode)(AVCodecContext *, uint8_t *buf, int buf_size, void *data);
  16. int(*close)(AVCodecContext*);
  17. int(*decode)(AVCodecContext *, void *outdata, int *outdata_size, uint8_t *buf, int buf_size);
  18.  
  19. }AVCodec;

H264 的主要结构的初始化如下:

  1. AVCodec ff_h264_decoder = {
  2. .name = "h264",
  3. .long_name = NULL_IF_CONFIG_SMALL("H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10"),
  4. .type = AVMEDIA_TYPE_VIDEO,
  5. .id = AV_CODEC_ID_H264,
  6. .priv_data_size = sizeof(H264Context),
  7. .init = h264_decode_init,
  8. .close = h264_decode_end,
  9. .decode = h264_decode_frame,
  10. .capabilities = /*AV_CODEC_CAP_DRAW_HORIZ_BAND |*/ AV_CODEC_CAP_DR1 |
  11. AV_CODEC_CAP_DELAY | AV_CODEC_CAP_SLICE_THREADS |
  12. AV_CODEC_CAP_FRAME_THREADS,
  13. .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE | FF_CODEC_CAP_EXPORTS_CROPPING |
  14. FF_CODEC_CAP_ALLOCATE_PROGRESS | FF_CODEC_CAP_INIT_CLEANUP,
  15. .flush = h264_decode_flush,
  16. .update_thread_context = ONLY_IF_THREADS_ENABLED(ff_h264_update_thread_context),
  17. .profiles = NULL_IF_CONFIG_SMALL(ff_h264_profiles),
  18. .priv_class = &h264_class,
  19. }

打开一个视频解码器示例

  1. videoStream = av_find_best_stream(ic, AVMEDIA_TYPE_VIDEO, -, -, NULL, );//获取视频流
  2. AVCodec *vcodec = avcodec_find_decoder(ic->streams[videoStream]->codecpar->codec_id);//获取codec
  3. AVCodecContext *vc = avcodec_alloc_context3(vcodec); //构造AVCodecContext ,并将vcodec填入AVCodecContext中
  4. avcodec_parameters_to_context(vc, ic->streams[videoStream]->codecpar); //初始化AVCodecContext
  5. int ret = avcodec_open2(vc, NULL,NULL); //打开解码器,由于之前调用avcodec_alloc_context3(vcodec)初始化了vc,那么codec(第2个参数)可以填NULL

6.AVCodecContext和AVCodec的更多相关文章

  1. ffmpeg实现dxva2硬件加速

    这几天在做dxva2硬件加速,找不到什么资料,翻译了一下微软的两篇相关文档.这是第二篇,记录用ffmpeg实现dxva2. 第一篇翻译的Direct3D device manager,链接:http: ...

  2. ffmpeg 和 SDL 的结合使用

    FFmpeg是一套可以用来记录.转换数字音频.视频,并能将其转化为流的开源计算机程序.采用LGPL或GPL许可证.它提供了录制.转换以及流化音视 频的完整解决方案.它包含了非常先进的音频/视频编解码库 ...

  3. SDL播放声音

    extern "C" { #include <libavcodec/avcodec.h> #include <libavformat/avformat.h> ...

  4. 转:ffdshow 源代码分析

    ffdshow神奇的功能:视频播放时显示运动矢量和QP FFDShow可以称得上是全能的解码.编码器.最初FFDShow只是mpeg视频解码器,不过现在他能做到的远不止于此.它能够解码的视频格式已经远 ...

  5. [原]如何在Android用FFmpeg+SDL2.0解码图像线程

    关于如何在Android上用FFmpeg+SDL2.0解码显示图像参考[原]如何在Android用FFmpeg+SDL2.0解码显示图像 ,关于如何在Android使用FFmpeg+SDL2.0解码声 ...

  6. [原]如何在Android用FFmpeg+SDL2.0解码声音

    关于如何在Android上用FFmpeg+SDL2.0解码显示图像参考[原]如何在Android用FFmpeg+SDL2.0解码显示图像 ,本文是基于上述文章和[原]零基础学习视频解码之解码声音 来移 ...

  7. [原]如何在Android用FFmpeg+SDL2.0解码显示图像

    如何在Android上使用FFmpeg解码图像参考文章[原]如何在Android用FFmpeg解码图像 ,如何在Android上使用SDL2.0来显示图像参考[原]零基础学习SDL开发之在Androi ...

  8. [原]如何在Android用FFmpeg解码图像

    前一篇[原]如何用Android NDK编译FFmpeg 我们知道了如何使用NDK来编译Android平台下使用的FFmpeg动态库.这篇文章我们就可以使用Android下的JNI来调用FFMpeg进 ...

  9. [原]零基础学习视频解码之seek

    现在,我们要添加一些功能,当你看不能倒带的电影,是不是很烦? 那么函数av_seek_frame功能看起来是多么赏心悦目. 我们将让左,右箭头来回走在影片中通过一个小的向上和向下箭头很多,其中“三多一 ...

随机推荐

  1. Zookeeper学习(二)

    一.Znode节点属性 dataVersion 数据版本, 每次当 Znode 中的数据发生变化的时候, dataVersion都会自增一下cversion 节点版本, 每次当 Znode 的节点发生 ...

  2. C#LeetCode刷题之#561-数组拆分 I(Array Partition I)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3718 访问. 给定长度为 2n 的数组, 你的任务是将这些数分成 ...

  3. 设计模式详解及Python实现

    设计模式及Python实现 设计模式是什么? Christopher Alexander:"每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心*.这样你就能一次又一 ...

  4. 【Azure DevOps系列】什么是Azure DevOps

    DevOps DevOps是一种重视"软件开发人员(Dev)"和"IT运维技术人员(Ops)"之间沟通合作的文化,它促进开发和运营团队之间的协作,以自动化和可重 ...

  5. SpringBoot --- 自定义 Starter

    SpringBoot --- 自定义 Starter 创建 1.需要创建一个新的空工程 2.新的工程需要引入两个模块 一个Maven 模块 作为启动器 一个SpringBoot 模块 作为自动配置模块 ...

  6. Android studio 在项目里配置签名 + cmd命令安装apk在测试机

    一.在项目里配置签名 搜索百度里有很多可视化操作在项目里配置签名,但是对于已经有签名的旧项目来说,用语句是最方便的. 方法: 第一步:把签名文件放到项目中,和build.gradle的同一级目录下.当 ...

  7. Android CC框架中,新建组件无法显示布局问题

    出错: 当在创建新的组件时,跳转到新组件成功,但是无法正确显示布局,即获取到布局文件的控件等. 原因: 当在创建新的组件时,默认生成MainActivity以及其布局activity_main.每个组 ...

  8. 解决QT5移植报错:This application failed to start because no Qt platform plugin could be initialized

    今天自己基于Pyqt5开发了一个软件,打包成exe后在自己的电脑上运行正常,在其他机器上提示: This application failed to start because no Qt platf ...

  9. Golang bytes.buffer详解

    原文:https://www.jianshu.com/p/e53083132a25 Buffer 介绍 Buffer 是 bytes 包中的一个 type Buffer struct{…} A buf ...

  10. Java多线程_ReentrantLock

    ReentrantLock是重入锁,它与synchronized很像,它是synchronized的加强版,因为它具有一些synchronized没有的功能.下面我们看看两者的区别:synchroni ...