ffmpeg 编码器AVCodecContext 的配置参数和视频解码的重要成员讲解 您所在的位置:网站首页 解码器的使用过程视频 ffmpeg 编码器AVCodecContext 的配置参数和视频解码的重要成员讲解

ffmpeg 编码器AVCodecContext 的配置参数和视频解码的重要成员讲解

2024-07-16 07:31| 来源: 网络整理| 查看: 265

今天重点讲解一下ffmpeg编码器AvCodecContext和解码的重要参数,这也是ffmpeg的重中之重。 1、先讲一下基本的API

AVFormatContex * pFormatCtxEnc; AVCodecContext * pCodecCtxEnc; AVStream * video_st; AVOutputFormat * pOutputFormat; pOutputFormat = av_guess_format(NULL,/*文件名*/,NULL); //根据文件后缀来猜测文件的格式 pFormatCtxEnc = avformat_alloc_context(); pFormatCtxEnc->oformat = pOutputFormat; video_st = avformat_new_stream(pFormatCtxEnc,0);

2、开始配置编码器上下文的参数

/*AVCodecContext 相当于虚基类,需要用具体的编码器实现来给他赋值*/ pCodecCtxEnc = video_st->codec; //编码器的ID号,这里我们自行指定为264编码器,实际上也可以根据video_st里的codecID 参数赋值 pCodecCtxEnc->codec_id = AV_CODEC_ID_H264; //编码器编码的数据类型 pCodecCtxEnc->codec_type = AVMEDIA_TYPE_VIDEO; //目标的码率,即采样的码率;显然,采样码率越大,视频大小越大 pCodecCtxEnc->bit_rate = 200000; //固定允许的码率误差,数值越大,视频越小 pCodecCtxEnc->bit_rate_tolerance = 4000000; //编码目标的视频帧大小,以像素为单位 pCodecCtxEnc->width = 640; pCodecCtxEnc->height = 480; //帧率的基本单位,我们用分数来表示, //用分数来表示的原因是,有很多视频的帧率是带小数的eg:NTSC 使用的帧率是29.97 pCodecCtxEnc->time_base.den = 30; pCodecCtxEnc->time_base = (AVRational){1,25}; pCodecCtxEnc->time_base.num = 1; //像素的格式,也就是说采用什么样的色彩空间来表明一个像素点 pCodecCtxEnc->pix_fmt = PIX_FMT_YUV420P; //每250帧插入1个I帧,I帧越少,视频越小 pCodecCtxEnc->gop_size = 250; //两个非B帧之间允许出现多少个B帧数 //设置0表示不使用B帧 //b 帧越多,图片越小 pCodecCtxEnc->max_b_frames = 0; //运动估计 pCodecCtxEnc->pre_me = 2; //设置最小和最大拉格朗日乘数 //拉格朗日乘数 是统计学用来检测瞬间平均值的一种方法 pCodecCtxEnc->lmin = 1; pCodecCtxEnc->lmax = 5; //最大和最小量化系数 pCodecCtxEnc->qmin = 10; pCodecCtxEnc->qmax = 50; //因为我们的量化系数q是在qmin和qmax之间浮动的, //qblur表示这种浮动变化的变化程度,取值范围0.0~1.0,取0表示不削减 pCodecCtxEnc->qblur = 0.0; //空间复杂度的masking力度,取值范围 0.0-1.0 pCodecCtxEnc->spatial_cplx_masking = 0.3; //运动场景预判功能的力度,数值越大编码时间越长 pCodecCtxEnc->me_pre_cmp = 2; //采用(qmin/qmax的比值来控制码率,1表示局部采用此方法,) pCodecCtxEnc->rc_qsquish = 1; //设置 i帧、p帧与B帧之间的量化系数q比例因子,这个值越大,B帧越不清楚 //B帧量化系数 = 前一个P帧的量化系数q * b_quant_factor + b_quant_offset pCodecCtxEnc->b_quant_factor = 1.25; //i帧、p帧与B帧的量化系数便宜量,便宜越大,B帧越不清楚 pCodecCtxEnc->b_quant_offset = 1.25; //p和i的量化系数比例因子,越接近1,P帧越清楚 //p的量化系数 = I帧的量化系数 * i_quant_factor + i_quant_offset pCodecCtxEnc->i_quant_factor = 0.8; pCodecCtxEnc->i_quant_offset = 0.0; //码率控制测率,宏定义,查API pCodecCtxEnc->rc_strategy = 2; //b帧的生成策略 pCodecCtxEnc->b_frame_strategy = 0; //消除亮度和色度门限 pCodecCtxEnc->luma_elim_threshold = 0; pCodecCtxEnc->chroma_elim_threshold = 0; //DCT变换算法的设置,有7种设置,这个算法的设置是根据不同的CPU指令集来优化的取值范围在0-7之间 pCodecCtxEnc->dct_algo = 0; //这两个参数表示对过亮或过暗的场景作masking的力度,0表示不作 pCodecCtxEnc->lumi_masking = 0.0; pCodecCtxEnc->dark_masking = 0.0;

3、一些针对具体要求进行的配置

(1)x264编码时延问题

方法一:

vcodec_encode_video2函数输出的延时仅仅跟max_b_frames的设置有关, 想进行实时编码,将max_b_frames设置为0便没有编码延时了

方法二:

1、使用264的API设置编码速度 /** * ultrafast,superfast, veryfast, faster, fast, medium * slow, slower, veryslow, placebo. 这是x264编码速度的选项 */ av_opt_set(m_context->priv_data,"preset","ultrafast",0);

第二部分 视频解码的重要成员讲解 enum AVMediaType codec_type:codec的类型,音频,视频等等。

const struct AVCodec *codec;:codec结构体,以后详细介绍。

enum AVCodecID codec_id:比如AV_CODEC_ID_H264,表示AVC的codec。

uint8_t *extradata:这个数组就有意思了,不同的标准有不同的用法。

比如JPG,这里就存放着默认的Huffman表。

比如Mpeg-4,存放着VISOBJSEQ头,即序列头信息。

比如RV10,存放additional flags(不懂)。

AVRational time_base:用分数表示时间基本单位。比如: 在这里插入图片描述 time_base = 1001/48000(单位:秒)

int gop_size:一个group of picture中picture的数量,通常一个gop就是一个序列。

enum AVPixelFormat pix_fmt:图像的格式,比如AV_PIX_FMT_YUV420P表示4:2:0的YUV图像。

uint16_t *intra_matrix:intra的量化矩阵(非默认)。

uint16_t *inter_matrix:inter的量化矩阵(非默认)。

int slices:slice的数量。

int frame_number:frame的计数器,表示解到哪一帧了。

int profile,level:标准采用的profile和level,不同的标准有不同的profile和level对应不同的编解码参数,这个要去看各个标准的具体解释。

AVRational framerate:帧率的分数表示,比如: 在这里插入图片描述

帧率=24000/1001=23.977



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有