码率控制模式

1、参数控制

视频编码(有损)的目标是尽可能多的节省比特(码率)的同时尽量保持视频质量。码率控制是平衡码率和质量的重要工具。

选择哪种码率控制模式往往取决于你的应用场景。通常有以下几种常见场景:

  • 本地存储:压缩一个文件存到硬盘或网盘上,这时希望文件编码后质量尽可能好,所以压缩率可以低一点,此时不关心压缩后文件的具体大小;
  • 流媒体:想要通过网络传输一个文件,这是你要确保文件码率不超过网络带宽,或者你需要在不同带宽下提供不同码率的文件(例如,在网上看视频网络不好时将视频从高清切换到低清,分辨率也同时降低)。
  • 直播流(和2类似),但是你需要尽快编码(实时),并且直播时你无法提前预知视频内容。
  • 面向设备的编码:例如你想向DVD或蓝光碟上存放文件,你想使文件编码后达到特定大小(正好占满碟片空间),更关心文件大小;

了解使用场景可以帮助你选择码率控制模式。

下面介绍不同的码率控制模式,这些模式基于ffmpeg中的x264、x265、libvpx编码器。

CQP(恒定质量参数)

固定质量参数,每一帧图像在压缩的时候,采用相同的QP值(QP值决定了量化编码时从像素宏块的原始信息中丢弃多少信息)。

但在遇到运动比较激烈的图像时,单位时间内要表现得内容该多的还是多。

比如游戏直播,几乎每一秒画面都在运动,码率很难降低下来。

av_opt_set(pOutVideoCodecCtx->priv_data, "qp", "23", AV_OPT_SEARCH_CHILDREN);

测试表现:

CRF(恒定码率因子)

限制码率因子,CRF是264和265进行码率控制的设置,这个值可以在0~1之间,值越低越好,质量越好,文件越大。

量化的比例范围是 0~51,0为无损,23为缺省值,51质量最差。一边设置为18~28,18视觉上无损,码率比23时文件大小几乎翻倍,编码速度慢很多。

  • 若CRF+6,输出码率大概率减少一半;
  • 若CRF-6,输出的码率大概率增加一倍;

CQP在编码时候,会保持每一帧的QP不变,例如恒定QP=18,那么整个序列的每一帧QP都是18。但CRF会通过动态调整每一帧的QP值,保持质量恒定。

// CRF 
av_opt_set(pOutVideoCodecCtx->priv_data, "crf", "23", AV_OPT_SEARCH_CHILDREN); 
// ffmpeg命令范例 
ffmpeg -i input.mp4 -c:v libx264 -crf 22 -c:a copy output.mp4

测试表现:

下图是QP和CRF等于17和23时,每帧比特数的变化。

2、码率控制

CBR(固定比特率)

是以恒定比特率方式进行编码,有Motion发生时,由于码率恒定,只能通过增大QP(量化参数)来减少码字大小,图像质量变差,当场景静止时,图像质量又变好,因此图像质量不稳定。

量化参数(Quantization Parameter,QP)控制着压缩大小。QP越大压缩率越高同时质量越低,QP越小压缩率越低同时质量越高。在H.264和H.265中,QP的范围是0-51间的整数。你可以很容易的在x264和x265中设置固定QP来编码,注意:libvpx没有固定QP模式。

这种算法优先考虑码率(带宽)。

应用场景:1)文档存储;2)高效使用带宽的场景;

ffmpeg -i <input> -c:v libx264 -x264-params "nal-hrd=cbr:force-cfr=1" -b:v 1M -minrate 1M -maxrate 1M -bufsize 2M <output>

(1)优点:压缩快,能被大多数软件和设备支持。
(2)缺点:占用空间大,效果不是十分理想。现已逐渐被VBR方式取代。

// CBR 
int bitRate = 800000; 
pOutVideoCodecCtx->bit_rate = bitRate; 
pOutVideoCodecCtx->rc_min_rate = bitRate; 
pOutVideoCodecCtx->rc_max_rate = bitRate; 
pOutVideoCodecCtx->bit_rate_tolerance = bitRate; 
pOutVideoCodecCtx->rc_buffer_size = bitRate; 
pOutVideoCodecCtx->rc_initial_buffer_occupancy = pOutVideoCodecCtx>rc_buffer_size * 3 / 4; 
pOutVideoCodecCtx->rc_buffer_aggressivity = (float)1.0; 
pOutVideoCodecCtx->rc_initial_cplx = 0.5;

测试表现:

VBR(动态比特率)

动态比特率,其码率可以随着图像的复杂程度的不同而变化,因此其编码效率比较高,Motion发生时,马赛克很少。码率控制算法根据图像内容确定使用的比特率,图像内容比较简单则分配较少的码率(似乎码字更合适),图像内容复杂则分配较多的码率,这样既保证了质量,又兼顾带宽限制。

包括3个参数:

  • 目标码率
  • 最小码率
  • 最大码率

这种算法优先考虑图像质量。

(1)优点:可以让整首歌都能大致达到我们的音质要求。
(2)缺点:编码时无法估计压缩出来的文件体积大小

// VBR 
pOutVideoCodecCtx->flags |= CODEC_FLAG_QSCALE; 
pOutVideoCodecCtx->rc_min_rate = bitRate - 400000; 
pOutVideoCodecCtx->rc_max_rate = bitRate + 400000; 
pOutVideoCodecCtx->bit_rate = bitRate;

测试结果:

3、H.264画质级别

H.264 baseline profile、extended profile和main profile都是针对8位样本数据、4:2:0格式(YUV)的视 频序列。在相同配置情况下,high profile(HP)可以比main profile(MP)降低10%的码率。

根据应用领域的不同,Baseline profile多应用于实时通信领域,Main profile多应用于流媒体领域, High profile则多应用于广电和存储领域。

// profile
av_dict_set(&param, "profile", "main", 0);

面试的时候也会被问到,如何降低码率的情况下保证画面质量,是可以从main->high选择profile,但 high profile在编码的过程会占用更多的cpu资源。

4、preset

编码加快,意味着信息丢失越严重,输出图像质量越差。

他们之间的区别这取决于源材料,目标比特率和您的硬件配置。 通常,比特率越高,编码所需的时间越 多。

这是一个示例,显示了1080p视频的两次通过编码的(标准化)编码时间:

从中到慢,所需时间增加了约40%。相反,变慢会导致所需时间增加大约100%(将花费两倍的时间)。 与中等速度相比,veryslow需要原始编码时间的280%,而质量较慢的速度只有很少的改进。使用快速可节省大约10%的编码时间,快则可节省25%。 超快将节省55%的成本,但质量要低得多。

// preset
av_dict_set(&param, "preset", "veryfast", 0);

如果未配置该选项,或者采取较慢的速度,会导致CPU消耗过大的问题。

5、tune

主要配合视频类型和视觉优化的参数况。如果视频的内容符合其中一个可用的调整值又或者有其中需要,则可以使用此选项,否则建议不使用(如tune grain是为高比特率的编码而设计的)。

代码实现:

// tune
av_dict_set(&param, "tune", "zerolatency", 0);

6、码率自适应算法

当我们的网络波动的时候,我们可以做什么?
1、上层降低码率。如:丢帧。
2、码率动态切换。例如:当我网络状况不佳的时候,我就降低码率。当网速充足的时候,就升高码率。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

毕加索解锁

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值