基本用法

在进行音视频操作时,会遇到 一个很重要的结构体 AVCodecContext .这个结构体影响到生成视频的质量。我们先来看看基本用法。

  1. AVCodecContext * pCodecCtxEnc;
  2. AVCodec *codec;//编码器
  3. codec = avcodec_find_encoder(AV_CODEC_ID_H264);//h.264编码器查找
  4. /*AVCodecContext 相当于虚基类,需要用具体的编码器实现来给他赋值*/
  5. pCodecCtxEnc=avcodec_alloc_context3(codec);

基本参数

他的参数有很多,我们先来看看常用的几个参数:

  1. /*AVCodecContext 相当于虚基类,需要用具体的编码器实现来给他赋值*/
  2. pCodecCtxEnc = video_st->codec;
  3. //编码器的ID号,这里我们自行指定为264编码器,实际上也可以根据video_st里的codecID 参数赋值
  4. pCodecCtxEnc->codec_id = AV_CODEC_ID_H264;
  5. //编码器编码的数据类型
  6. pCodecCtxEnc->codec_type = AVMEDIA_TYPE_VIDEO;
  7. //像素的格式,也就是说采用什么样的色彩空间来表明一个像素点
  8. pCodecCtxEnc->pix_fmt = PIX_FMT_YUV420P;
  9. //目标的码率,即采样的码率;显然,采样码率越大,视频大小越大
  10. pCodecCtxEnc->bit_rate = 200000;
  11. //固定允许的码率误差,数值越大,视频越小
  12. pCodecCtxEnc->bit_rate_tolerance = 4000000;
  13. //编码目标的视频帧大小,以像素为单位
  14. pCodecCtxEnc->width = 1080;
  15. pCodecCtxEnc->height = 720;
  16. //帧率的基本单位,我们用分数来表示,分母为帧数
  17. //用分数来表示的原因是,有很多视频的帧率是带小数的eg:NTSC 使用的帧率是29.97
  18. pCodecCtxEnc->time_base = (AVRational){1,25};
  19. //每250帧插入1个I帧,I帧越少,视频越小
  20. pCodecCtxEnc->gop_size = 250;

进阶参数

以上是基本设置,设置后保证视频的基本功能。下面看看一些进阶参数:

  1. //运动估计
  2. pCodecCtxEnc->pre_me = 2;
  3. //设置最小和最大拉格朗日乘数
  4. //拉格朗日乘数 是统计学用来检测瞬间平均值的一种方法
  5. pCodecCtxEnc->lmin = 1;
  6. pCodecCtxEnc->lmax = 5;
  7. //最大和最小量化系数
  8. pCodecCtxEnc->qmin = 10;
  9. pCodecCtxEnc->qmax = 50;
  10. //因为我们的量化系数q是在qmin和qmax之间浮动的,
  11. //qblur表示这种浮动变化的变化程度,取值范围0.0~1.0,取0表示不削减
  12. pCodecCtxEnc->qblur = 0.0;
  13. //空间复杂度的masking力度,取值范围 0.0-1.0
  14. pCodecCtxEnc->spatial_cplx_masking = 0.3;
  15. //运动场景预判功能的力度,数值越大编码时间越长
  16. pCodecCtxEnc->me_pre_cmp = 2;
  17. //采用(qmin/qmax的比值来控制码率,1表示局部采用此方法,)
  18. pCodecCtxEnc->rc_qsquish = 1;
  19. //设置 i帧、p帧与B帧之间的量化系数q比例因子,这个值越大,B帧越不清楚
  20. //B帧量化系数 = 前一个P帧的量化系数q * b_quant_factor + b_quant_offset
  21. pCodecCtxEnc->b_quant_factor = 1.25;
  22. //i帧、p帧与B帧的量化系数便宜量,便宜越大,B帧越不清楚
  23. pCodecCtxEnc->b_quant_offset = 1.25;
  24. //p和i的量化系数比例因子,越接近1,P帧越清楚
  25. //p的量化系数 = I帧的量化系数 * i_quant_factor + i_quant_offset
  26. pCodecCtxEnc->i_quant_factor = 0.8;
  27. pCodecCtxEnc->i_quant_offset = 0.0;
  28. //码率控制测率,宏定义,查API
  29. pCodecCtxEnc->rc_strategy = 2;
  30. //b帧的生成策略
  31. pCodecCtxEnc->b_frame_strategy = 0;
  32. //消除亮度和色度门限
  33. pCodecCtxEnc->luma_elim_threshold = 0;
  34. pCodecCtxEnc->chroma_elim_threshold = 0;
  35. //DCT变换算法的设置,有7种设置,这个算法的设置是根据不同的CPU指令集来优化的取值范围在0-7之间
  36. pCodecCtxEnc->dct_algo = 0;
  37. //这两个参数表示对过亮或过暗的场景作masking的力度,0表示不作
  38. pCodecCtxEnc->lumi_masking = 0.0;
  39. pCodecCtxEnc->dark_masking = 0.0;

需求配置

264延时问题

  • vcodec_encode_video2() 函数输出的延时仅仅跟 max_b_frames 的设置有关,想进行实时编码,将 max_b_frames 设置为0便没有编码延时了.
  • 使用264的API设置编码速度 ,设置方式如下:
    1. /**
    2. * ultrafast,superfast, veryfast, faster, fast, medium
    3. * slow, slower, veryslow, placebo. 这是x264编码速度的选项
    4. */
    5. av_opt_set(m_context->priv_data,"preset","ultrafast",0);

    原文出处

    参考文章:https://blog.csdn.net/chance_yin/article/details/16335625