Capped CRF:节省编码成本和数据流

Stella981
• 阅读 1031

Capped CRF:节省编码成本和数据流

Capped CRF编码是一种单通道编码方法,与双通道VBR相比,可以节省编码成本。Capped CRF也是一种简单的per-title编码方法,可以降低带宽成本并且提高观众的体验质量。本文来自资深多媒体技术咨询师Jan Oze,LiveVideoStack对原文进行了摘译。

文 / Jan Ozer

译 / 王月美

审校 / Ant

原文:

https://streaminglearningcenter.com/blogs/saving-encoding-streaming-deploy-capped-crf.html

Per-title编码为每个编码定制视频素材的复杂性。难以编码的视频剪辑用以比普通阶梯更高的数据速率进行编码,而较容易编码的视频剪辑则是以较低的数据速率来进行编码。由于大多数编码阶梯都较为保守,因此,在大多数情况下,部署per-title编码将会导致大部分视频剪辑的数据速率降低。

你可以从许多不同的供应商处以多种形式访问per-title编码。例如,你可以从Beamr,Crunch Media,Euclid IQ和ZPEG获得优化技术许可;部署来自Capella Systems,Harmonic,Elemental和其他具有per-title编码功能的公司的内部编码器;又或者从Bitmovin,Brightcove,JWPlayer和Mux,或者访问云中的per-title编码。根据你的编码平台,你可以通过名为Capped CRF的技术来自行推广。

节省带宽,或提高服务质量还是二者兼顾?

对于某些公司来说,部署Capped CRF将降低带宽成本。对于另一些公司来说,它将改善观众的服务质量。而对其他一些公司来说,以上二者兼有。而这完全取决于你向现有客户交付编码阶梯中的哪些视频流。

为了解释说明,请查阅表1,其显示了编码阶梯和三种不同的流分布模式A、B和C。每种模式显示了实际从自适应组传递的每个流的百分比,它正如你能够从日志文件中派生而出的一样。

Capped CRF:节省编码成本和数据流

表1:三种流分布模式

在模式A中,所有的传输流的数据速率均是3000Kbps或更低,这或许是在第三世界国家中分布的代表。这种情况下,切换到Capped CRF对带宽成本没有什么影响,因为你只是将一个3000 kbps的流(或更低)转换为另一个。当然,质量体验可能会得到改善。但是,与此同时你将分配相同的带宽流,因此带宽节省是会不明显的。

在分布模式B中,100%的传输流的数据速率是7800Kbps,这可能是如Scandinavia通过光纤到家分布的代表。在这里,部署Capped CRF可能会降低大多数最高带宽流的带宽,这将直接转化为带宽节省。对于特别难以编码的视频剪辑,它还可以改善观众的体验质量。

模式C则显示顶部梯级的高度集中和其他梯级的适宜传播,这可能是移动和宽带的混合。同样,部署Capped CRF会降低梯形图中大多数流的数据速率,从而降低传输带宽。而且,它还可以提高客户观看的一些视频流的质量,从而提高用户的体验质量。

显而易见的是,带宽节省取决于你的分布模式,即必须从日志文件中挖掘的数据。当然,这也取决于你对现有阶梯的攻击力。如果你的1080p视频的最高比特率是6000 Kbps或更高,而你分发了很多这样的视频流,那么你可能会节省较多的带宽。如果它的速率是4200 Kbps,那么你再发布很多视频流就相当激进了,而节省的带宽会更加缓和。

注意,所有这些观察结果都适用于任何一项per-title技术,而不仅仅是Capped CRF。同时,它们也适用于实现如HEVC或AV1这样的新编解码器。

什么是Capped CRF

固定码率系数(CRF)是一种编码模式,可以向上或向下调整文件的数据速率,以实现选定的质量级别而不是特定的数据速率。CRF的取值范围从0到51,较低的数字将提供更高的视觉质量分数。多种编解码器均支持CRF,其中包括x264,x265以及VP9。

就其自身而言,CRF无法用于自适应比特率流,其中在梯级梯级中的数据速率需要受到限制。但是,通过向CRF添加“上限”,你可以将此数据速率限制为该上限值。实现上限 CRF的FFmpeg参数如下所示:

ffmpeg -i input_file -crf 23 -maxrate 6750k -bufsize 6750k output_file

这告知FFmpeg以23的质量等级进行编码,但是使用4500kbps的VBV缓冲器将数据速率限制在6750kbps。对于易于编码的视频剪辑,CRF值将限制数据速率,因为可以在低于上限的数据速率下实现所需的质量。而对于难以编码的视频剪辑,上限值将启动以控制数据速率。

Capped CRF缺乏了更复杂的per-title技术中的一些功能,例如能够改变阶梯中的梯级数或是改变某些梯级的分辨率的能力。尽管如此,在与其他技术相比时,总能更胜一筹。而且,如果你的编码工具支,那么它基本上是免费的。

对于Streaming Media East,我将Capped CRF与来自Capella Systems和Brightcove的per-title技术进行了比较。表2显示了关键结果。

Capped CRF:节省编码成本和数据流

表2.来自2018 Streaming Media East的per-title技术记分卡。

从表格中,你可以看到Capped CRF在节省存储空间中排名第二,流媒体带宽的节省排名最后,但是对VMAF的净影响排名第一。从本质上讲,这意味着虽然Capped CRF并没有像其他两种技术那样降低数据速率,但却有利于提高观众的体验质量。如果你的目标是节省更多数据流,则可以使用更高的CRF值来降低数据速率并略微降低视频质量。例如,我使用CRF为22进行测试,而JWPlayer使用CRF为23,则可以节省更多带宽。

Capped CRF的一个主要的优点就是它是单通道技术。如果你目前使用的是双通道技术,那么Capped CRF也会显着增加容量或削减成本。相比之下,其他大多数per-title技术在实际编码之前需要进行额外的分析,这可能会提高编码成本或者会降低容量。

Capped CRF的单通道特性反映在“save”栏中的数据98上,这代表14个测试文件里七个梯级每一个的一次通过。Capella和Brightcove技术是通过从易于编码的视频剪辑的编码阶梯中消除梯级来获得saves值,但这并不会影响用于他们的per-title编码的两个系统分析的传递(它将用于下一次传递)。

比特率控制问题

关于Capped CRF的一个问题是:由于除了上限值之外没有其他比特率控制,文件中可能存在巨大的数据速率波动,这可能会破坏你所选择的ABR技术中所使用的切换算法。图1所示的文件中包含了芭蕾舞剧(峰值)与一部谈话短片的混合(谷值),这导致文件内的数据速率大小从约低于3Mbps变为6Mbps。

Capped CRF:节省编码成本和数据流

图1.使用Capped CFR编码的文件中重要数据速率的波动.

事实上,其他大多数VBR技术都提供类似的文件。例如,图2显示了使用200%约束VBR用FFmpeg编码的同一文件的数据速率。在该文件中,谷值大致相同,但峰值略高。所以,如果你现在使用200%约束VBR,则Capped CRF应该不会造成任何的担忧。

Capped CRF:节省编码成本和数据流

图2.使用200%约束VBR编码的文件中更为糟糕的数据速率波动

另一方面,如果是因为你认为它最大化了文件的可传递性而使用CBR,那么Capped CRF就绝对不适合你。从我的角度来看,JWPlayer在部署数年后继续使用Capped CRF的事实消除了大部分的问题。

留意摄像头屏幕

我大约用20个测试剪辑测试per-title技术,其中包括三个左右的摄像头屏幕或类似的合成剪辑。在写本篇文章的时候,我测试确认了CRF是否会严重降低了任何剪辑的质量,并通过莫斯科州立大学VQMT的结果图进行简化,如图3所示。

Capped CRF:节省编码成本和数据流

图3.结果图显示了Capped CRF和200%约束VBR之间显着的质量差异

简单的说,我在这些分析中使用了PSNR(而不是VMAF),因为它计算速度非常快,并且对于质量问题的分析非常有效。这里,我正分析200%约束VBR(橙色表示)和Capped CRF(绿色表示)。顶部图表显示整个文件中两个文件的PSNR值,而底部图表则显示顶部图表中突出显示的区域(大约是55%—65%)。数值之间的显着增量通常表明了非常显着的质量差异。

如果单击剪辑右下角的“Show Fram”,则可以切换两个分析剪辑中的源帧和各个帧。图4显示了来自Capped CRF剪辑屏幕的一部分,很明显能够看到它的降级。

Capped CRF:节省编码成本和数据流

图4.表示这样的几帧

请注意,到目前为止,这是我在三个合成剪辑中看到的最大的质量差异,而且是在现实世界的剪辑或动画中没有任何意义的差异。大多数真实世界的剪辑的比较如图5所示。这是一个高动态剪辑,其中CRF提供的数据速率略高于200%约束VBR,而且质量略高,但200%约束VBR图没有主要的增量。

Capped CRF:节省编码成本和数据流

图5. CRF剪辑始终略高于200%约束VBR。

因此,尽管我不建议将Capped CRF用于无需额外测试的摄像头屏幕和类似的合成镜头,但我很乐意推荐将它用于真实世界的视频和动画。

部署Capped CRF

只要编码器允许你对编码参数进行精细控制,部署Capped CRF编码就非常简单。例如,图6是来自Hybrik云编码器的基于浏览器的用户界面的屏幕截图。如你所见,你选择了CRF比特率模式,然后输入max_bitrate和vbv_buffer大小值(CRF值的条目位于下方且并未显示)。如果你使用的是API,则可以通过JSON配置相同的参数。大多数云编码器都是围绕FFmpeg构建的,因此如果其他per-title方法不可用,那你就可以访问CRF编码。

Capped CRF:节省编码成本和数据流

图6.在Hybrik云编码器中选择Capped CRF.

如果你的桌面编码器不允许你选择crf作为比特率,你可以直接在用户界面中输入x264命令。这是我上次确认的Telestream Vantage的一项功能。如果你可以访问CRF控件,则可以将这些替换为以前的比特率控制方法,无论是CBR还是VBR。

FFmpeg中的Capped CRF

下面的批处理文件显示了Streaming Media比较中的测试阶梯,其中缺少通常你在FFmpeg批处理中能够看到的GOP,预设,音频和其他命令。当然,我已将CRF值更改为23以匹配JWPlayer。我将最大速率和缓冲区大小设置为原始目标数据速率的1.5倍,即1080p视频流的速率为4500 kbps。JWPlayer也为数据速率和缓冲区大小设置了相同的值,当然我也看到过其他文档将缓冲区设为目标的两倍。

1ffmpeg -i Input.mp4 -c:v libx264 -crf 23 -maxrate 6750k -bufsize 6750k Output_1080p.mp42ffmpeg -i Input.mp4 -c:v libx264 -crf 23 -s 1280x720 -maxrate 4050k -bufsize 4050k Output_720p.mp43ffmpeg -i Input.mp4 -c:v libx264 -crf 23 -s 960x540 -maxrate 2850k -bufsize 2850k Output_540p.mp44ffmpeg -i Input.mp4 -c:v libx264 -crf 23 -s 852x480 -maxrate 2025k -bufsize 2025k Output_480p.mp45ffmpeg -i Input.mp4 -c:v libx264 -crf 23 -s 640x360 -maxrate 1350k -bufsize 1350k Output_360p.mp46ffmpeg -i Input.mp4 -c:v libx264 -crf 23 -s 480x272 -maxrate 750k -bufsize 750k Output_272p.mp47ffmpeg -i Input.mp4 -c:v libx264 -crf 23 -s 320x180 -maxrate 375k -bufsize 375k Output_180p.mp4

批处理1.使用Capped CRF编码完整的梯形图。

请注意,你可以调整这些所有的参数以实现特定的传输和体验质量目标。较低的CRF值(如21-22)将提供更高的比特率和更好的体验质量,而更高的CRF值则(如24-25)带来的结果就恰恰相反。

多分辨率

可以看到,批处理1中包含七个具有不同分辨率的梯级。这将步骤进行了简化,因为只要在所有梯级中使用相同的CRF值,较大的分辨率应始终具有较高的数据速率,从而保留有效流切换所需的数据速率级数。

但是,如果你在720p有三个梯级会发生什么?比如CRF值分别为 21,23和25?

你如何确定720p @ CRF 25时梯级的数据速率高于下一个较低的梯级,如540p @ CRF 21。4K视频镜头里的梯子可以有9到11个梯级,所以你几乎肯定会遇到这个问题。

在使用VR 4K素材时,我遇到过这种情况。在那种情况下,我在不同分辨率和CRF值的多个剪辑上运行测试编码器。通过这些数据,我创建了一个梯形图。它利用不同的CRF值,并多次使用多个分辨率(如4K,1080p和720p)。然后我用多个视频剪辑测试了该梯形图,编码复杂度从简单到复杂,以确保梯子在所有梯级之间保持必要的数据速率。

使用非常简单的剪辑,较低的梯级往往非常靠近。这仅仅是因为若最高速率为5 Mbps,则不需要11个梯级。当然,ABR小组仍然可行。我测试的难以编码的文件看起来就近乎完美。

Capped CRF:节省编码成本和数据流

本文分享自微信公众号 - LiveVideoStack(livevideostack)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
3个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
9个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这