6.AVCodecContext和AVCodec
- extradata 和 extradata_size 两个成员表述了相应 Codec 使用的私有数据;
- codec成员关联相应的编解码器;
- priv_data 成员关联各个具体编解码器独有的属性 context,与 AVCodec 结构中的 priv_data_size 配对使用。
typedef struct AVCodecContext
{
enum AVMediaType codec_type; /* see AVMEDIA_TYPE_xxx */
const struct AVCodec *codec; //指向相应的解码器,如: ff_h264_decoder
enum AVCodecID codec_id; /* see AV_CODEC_ID_xxx */
void *priv_data;//指向具体相应的解码器的 context,如 H264Context int bit_rate;
int frame_number; int thread_count; //编解码时的线程数量,由用户设置,与CPU核心数有关,最佳效果一般设置为CPU核心数*2. AVRational time_base; //时间的基准单位 unsigned char *extradata;//扩展数据,如 mov 格式-> audio trak ->aac -> esds 格式中的附加解码信息、H.264解码器的存储SPS,PPS信息等. int extradata_size;//扩展数据的 size int width, height; //视频的原始的宽度与高度,仅针对视频 enum PixelFormat pix_fmt;//视频一帧图像的格式,如 YUV420 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设置。
int bits_per_sample;
int block_align; //公共操作函数
int (*alloc_frame)(AVCodecContext *avctx, AVFrame *frame);
int (*start_frame)(AVCodecContext *avctx, const uint8_t *buf, uint32_t buf_size);
int (*decode_params)(AVCodecContext *avctx, int type, const uint8_t *buf, uint32_t buf_size);
int (*decode_slice)(AVCodecContext *avctx, const uint8_t *buf, uint32_t buf_size);
int (*end_frame)(AVCodecContext *avctx);
}AVCodecContext;
其中codec成员结构体为AVCodec.
- next 成员用于把所有支持的编解码器连接成链表,便于遍历查找;
- id 确定唯 一编 解 码器 ;
- priv_data_size 表示具 体 的 Codec 对应的 Context 结构大 小 .
typedef struct AVCodec
{ const char *name;// 标示 Codec 的名字, 比如, "h264" "h263" 等。
const char *long_name; //表示Codec的长名字,比如h264的长名字为"H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10"
enum AVMediaType type; // 标示 Codec 的类型,有 video , audio ,字幕等类型。
enum AVCodecID id; // 标示 Codec 的 ID,有 AV_CODEC_ID_H264等。 int priv_data_size; // 标示具体的 Codec 对应的 Context 的 size,比如h264的等于sizeof(H264Context) struct AVCodec *next; //以链表的形式指向下一个Codec(ID+1) // 以下标示 Codec 对外提供的操作,每一种解码器都会实现这些操作。
int(*init)(AVCodecContext*);
int(*encode)(AVCodecContext *, uint8_t *buf, int buf_size, void *data);
int(*close)(AVCodecContext*);
int(*decode)(AVCodecContext *, void *outdata, int *outdata_size, uint8_t *buf, int buf_size); }AVCodec;
H264 的主要结构的初始化如下:
AVCodec ff_h264_decoder = {
.name = "h264",
.long_name = NULL_IF_CONFIG_SMALL("H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10"),
.type = AVMEDIA_TYPE_VIDEO,
.id = AV_CODEC_ID_H264,
.priv_data_size = sizeof(H264Context),
.init = h264_decode_init,
.close = h264_decode_end,
.decode = h264_decode_frame,
.capabilities = /*AV_CODEC_CAP_DRAW_HORIZ_BAND |*/ AV_CODEC_CAP_DR1 |
AV_CODEC_CAP_DELAY | AV_CODEC_CAP_SLICE_THREADS |
AV_CODEC_CAP_FRAME_THREADS,
.caps_internal = FF_CODEC_CAP_INIT_THREADSAFE | FF_CODEC_CAP_EXPORTS_CROPPING |
FF_CODEC_CAP_ALLOCATE_PROGRESS | FF_CODEC_CAP_INIT_CLEANUP,
.flush = h264_decode_flush,
.update_thread_context = ONLY_IF_THREADS_ENABLED(ff_h264_update_thread_context),
.profiles = NULL_IF_CONFIG_SMALL(ff_h264_profiles),
.priv_class = &h264_class,
}
打开一个视频解码器示例
videoStream = av_find_best_stream(ic, AVMEDIA_TYPE_VIDEO, -, -, NULL, );//获取视频流
AVCodec *vcodec = avcodec_find_decoder(ic->streams[videoStream]->codecpar->codec_id);//获取codec
AVCodecContext *vc = avcodec_alloc_context3(vcodec); //构造AVCodecContext ,并将vcodec填入AVCodecContext中
avcodec_parameters_to_context(vc, ic->streams[videoStream]->codecpar); //初始化AVCodecContext
int ret = avcodec_open2(vc, NULL,NULL); //打开解码器,由于之前调用avcodec_alloc_context3(vcodec)初始化了vc,那么codec(第2个参数)可以填NULL
6.AVCodecContext和AVCodec的更多相关文章
- ffmpeg实现dxva2硬件加速
这几天在做dxva2硬件加速,找不到什么资料,翻译了一下微软的两篇相关文档.这是第二篇,记录用ffmpeg实现dxva2. 第一篇翻译的Direct3D device manager,链接:http: ...
- ffmpeg 和 SDL 的结合使用
FFmpeg是一套可以用来记录.转换数字音频.视频,并能将其转化为流的开源计算机程序.采用LGPL或GPL许可证.它提供了录制.转换以及流化音视 频的完整解决方案.它包含了非常先进的音频/视频编解码库 ...
- SDL播放声音
extern "C" { #include <libavcodec/avcodec.h> #include <libavformat/avformat.h> ...
- 转:ffdshow 源代码分析
ffdshow神奇的功能:视频播放时显示运动矢量和QP FFDShow可以称得上是全能的解码.编码器.最初FFDShow只是mpeg视频解码器,不过现在他能做到的远不止于此.它能够解码的视频格式已经远 ...
- [原]如何在Android用FFmpeg+SDL2.0解码图像线程
关于如何在Android上用FFmpeg+SDL2.0解码显示图像参考[原]如何在Android用FFmpeg+SDL2.0解码显示图像 ,关于如何在Android使用FFmpeg+SDL2.0解码声 ...
- [原]如何在Android用FFmpeg+SDL2.0解码声音
关于如何在Android上用FFmpeg+SDL2.0解码显示图像参考[原]如何在Android用FFmpeg+SDL2.0解码显示图像 ,本文是基于上述文章和[原]零基础学习视频解码之解码声音 来移 ...
- [原]如何在Android用FFmpeg+SDL2.0解码显示图像
如何在Android上使用FFmpeg解码图像参考文章[原]如何在Android用FFmpeg解码图像 ,如何在Android上使用SDL2.0来显示图像参考[原]零基础学习SDL开发之在Androi ...
- [原]如何在Android用FFmpeg解码图像
前一篇[原]如何用Android NDK编译FFmpeg 我们知道了如何使用NDK来编译Android平台下使用的FFmpeg动态库.这篇文章我们就可以使用Android下的JNI来调用FFMpeg进 ...
- [原]零基础学习视频解码之seek
现在,我们要添加一些功能,当你看不能倒带的电影,是不是很烦? 那么函数av_seek_frame功能看起来是多么赏心悦目. 我们将让左,右箭头来回走在影片中通过一个小的向上和向下箭头很多,其中“三多一 ...
随机推荐
- 文件上传Upload 学习笔记
整理完自己还有点晕,看来还是得找点靶场自己练习练习Orz 1:客户端JavaScript校验 Burp改包即可 2:服务端对Content-Type进行校验 猜测后,修改对应Content-Type字 ...
- Java环境变量配置,HelloWorld。
一 配置环境变量: 1.右键计算机属性 2.点击高级系统设置 3.点击环境变量 在新建页面,输入变量名“JAVA_HOME”:变量值“你的jdk的路径 在系统变量区域,选择“新建”,输入变量名“CL ...
- K均值聚类和DBSCAN介绍
K均值(K-means)聚类 问题定义:给定数据$\vec{x}_1,\vec{x}_2,\cdots,\vec{x}_n$,将它们分到不同的$K$个簇(cluster)中.定义$\vec{c}=(c ...
- Spring——AOP实现
Spring实现AOP 1.什么是 AOP AOP (Aspect Orient Programming),直译过来就是 面向切面编程.AOP 是一种编程思想,是面向对象编程(OOP)的一种补充.面向 ...
- jQuery - AJAX笔记
@ 目录 什么是AJAX 关于 jQuery 与 AJAX jQuery AJAX 参考手册 jQuery ajax - ajax() 方法 定义和用法 语法 参数 options async bef ...
- 分布式数据库中间件 MyCat | 分库分表实践
MyCat 简介 MyCat 是一个功能强大的分布式数据库中间件,是一个实现了 MySQL 协议的 Server,前端人员可以把它看做是一个数据库代理中间件,用 MySQL 客户端工具和命令行访问:而 ...
- 鼠标放上时显示隐藏的div或者其他代码的“jquery”的三种写法和“JavaScript”的一种写法
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 2020.5.21 第一篇 Scrum冲刺博客
Team:银河超级无敌舰队 Project:招新通 项目冲刺集合贴:链接 目录 一.Alpha 阶段成员任务安排 二.明日任务安排 三.预期的任务量 四.敏捷开发前的感想 五.团队期望 一.Alpha ...
- antdv时间选择a-date-picker设置日期可选范围(近一周、近半月、近一月等) - moment.js
Vue->Template: <a-date-picker v-model="value" :disabled-date="disabledDate" ...
- ASP.NET Core3.1使用IdentityServer4中间件系列随笔(五):创建使用[Code-授权码]授权模式的客户端
配套源码:https://gitee.com/jardeng/IdentitySolution 本篇将创建使用[Code-授权码]授权模式的客户端,来对受保护的API资源进行访问. 1.接上一篇项目, ...