MelonTeam 移动终端前沿技术的探索者

视频编解码模式

2017-12-31
andrewychen

视频编解码模式

对视频编解码做一定的介绍,方便大家对视频编解码有比较深入的了解

我们经常接触到视频编解码,而谈论得比较多的是编码方式,视频编码方式是对视频的介绍,方便我们在工作中进行选择。

1. 码率控制方式

有了上面的知识,我们可以知道要想对视频进行压缩,比较大的、直接的控制环节是量化。怎么做好变换、预测是选择性问题,控制更加细粒度的是宏块划分,选择更加复杂的预测算法,宽松的来讲其实对视频画质影响不大,最后的视频体积影响不是很大。而后面的商编码更加是无损的,更加信息论这里能做的压缩是优先的。不过是算法上的选择和优化罢了。

而量化则不同,影响每个宏块的编码其实就是qp值,qp值相差6格,表示视频的数据量就相差1倍!这里带来的收益是非常非常大的。所以精细化的控制好qp值在每一个宏块上的分配的策略,就是码率控制的方式。

总体上分为:
固定QP值
固定码率
平均码率
质量优先

下面进行详细的逐个讲解。

1.1 固定QP值

ffmpeg 命令:

ffmpeg -i xxx.mp4 -qp 30 out_xxx.mp4

含义:
这个情况下,对于每一个宏块分配的QP值都是我们指定的,显然这样是非常没有效率的。最终编码出来的视频大小是未知的。
通常是为视频编解码研究使用的。

1.2 固定码率

ffmpeg命令:

ffmpeg -i xxx.mp4 -v:b xxxk out_xxx.mp4

含义:顾名思义,不管画面如何变化,编码器保证视频的码率跟设定是一致的。这样的编码器相对是容易实现的,而且执行效率也很高。同时文件的体积是可以预期的。因此非常适合在直播这类场景使用。

1.3 平均码率

ffmpeg命令:

ffmpeg -i xxx.mp4 -v:b xxxk out_xxx.mp4

含义:平均码率是在固定码率基础上更加优化了。他在保证最终码率是一定时,也就是视频的大小是确定时,根据画面的复杂程度来合理分配码率。比如纹理复杂、运动比较多的画面分配更多的码率表现细节,而相对简单、静止的画面就分配少一定的码率。这样使得在相同的文件大小下,平均码率比固定码率整体的画质要更好。平均码率也称为动态码率。

可以补充对比图。

当然天下没有免费的午餐。平均码率编码速度比较慢,而且为了更加合理的分配码率,需要进行两趟的编码,第一趟把画面概要的信息提取出来,为第二趟精细化控制提供参考。

因此平均码率视频流媒体的应用场景。

1.4 质量优先

ffmpeg命令:

ffmpeg -i xxx.mp4 -crf 23 out_xxx.mp4

含义:质量优先,反过来讲就是码率不重要,编码的时候只考虑最终的画质,码率尽管分配。这样的编码器如果画面比较简单,那么最终视频的大小会非常的小。但是如果画面复杂,那么视频会非常的大。准确的讲,质量优先是属于动态码率。
编码也会比较复杂,耗时也会比较大。因此适合的场景是视频归档保存,下载后播放。

1.5 限制最大码率

ffmpeg命令:

ffmpeg -i xxx.mp4 -maxbitrate xxxk -bufsize xxxk out_xxx.mp4

前面我们平均码率和质量优先,都发现一个问题,码率是自由分配的。如果某些场景需要对码率的变化进行控制在一定的范围,就无能为力了。

幸好编码还提供了限制最大码率的方式。

小结

以上的几种方式,最终都是通过控制每个宏块的QP值来达到目的的。不同的策略各有优缺点,大家根据自己产品特点选择使用。


上一篇 Haskell IO

说一说

目录