Netflix:我们是如何评估Codec性能的?

Stella981
• 阅读 611

Netflix会定期评估现有和即将推出的视频编解码器,不断优化视频编码技术以提供更高质量的服务。本文介绍了视频编码器性能评估中的几项重要元素以及如何从传统与自适应流媒体两种视角进行编解码器性能对比。本文来自Netflix技术博客,LiveVideoStack进行了翻译。

文 / Joel Sole,Liwei Guo,Andrey Norkin,Mariana Afonso,Kyle Swanson,Anne Aaron

译 / 许海燕

审校 / Yunfei

原文:

https://medium.com/netflix-techblog/performance-comparison-of-video-coding-standards-an-adaptive-streaming-perspective-d45d0183ca95

“这是我对人们的建议:学习如何烹饪,尝试新的食谱,从错误中吸取教训,无所畏惧,最重要的是享受乐趣”  - Julia Child(美国厨师,作家和电视名人)

在Netflix,我们不断改进配方,以尽可能高的质量为您喜爱的节目和电影提供服务。这道菜中的一个基本元素是视频编码技术,我们用它将视频内容转换为压缩比特流(适用于您正好在Netflix上使用的任何带宽)。视频编码界已经做了大量的工作来开发视频编码标准(编解码器),目标是实现更好的压缩比。因此,一项基本任务是评估我们使用的材料的质量,在Netflix编码厨房中,我们通过定期评估现有和即将推出的视频编解码器和编码器的性能来实现这一目标。我们选择最新鲜和最好的编码技术来调味我们的视频内容, 以满足从《Salt, Fat, Acid, Heat》这样的纪录片到Chef’s Table中美味的食物片段的要求。

Netflix:我们是如何评估Codec性能的?

厨师的桌子

编解码器对比中的因素

在已发表的许多比较视频编解码器性能的文章中。这些文章的读者可能经常被它们看似矛盾的结论弄糊涂。一篇文章可能声称编解码器A比编解码器B好15%,而下一篇文章可能断言编解码器B比编解码器A好10%。

Netflix:我们是如何评估Codec性能的?

如果深入研究这个话题就会发现,这些明显的矛盾是可以预料到的。为什么?因为测试方法和内容在视频编解码器的评估中起着至关重要的作用。选择不同的测试条件可能导致不同的结果。接下来我们将讨论影响视频编解码器评估的几个因素:

  1. 编码器的实现

  2. 编码器的设置

  3. 方法

  4. 内容

  5. 度量

在适用的情况下,我们对传统的比较方法和自适应流媒体的方法进行了区分。

编码器的实现

视频编码标准有软件和硬件的实现,基于不同的目的,比如研究领域、广播、或者流媒体。 “参考编码器”是在视频标准化过程和研究期间使用的软件实现,并且作为实现者的参考软件。通常,这是标准的第一个实现,一般不用于产品。之后,由开源社区或商业实体开发的产品编码器出现。这些是大多数公司为其编码需求和应用中的速度和资源的限制而部署的实际实现。因此,参考和产品编码器的性能会大不相同。此外,标准配置文件和特定版本会影响观测到的性能,特别是对于新标准的还不怎么成熟的实现。Netflix部署了在流媒体应用中以获得最高主观质量的产品编码器。

编码设置

编码参数,例如编码的次数,并行化工具,码率控制,主观质量调节等,在结果中引入了高度的可变性。这些编码设置的选择主要是由应用背景而决定的。

标准化机构倾向于使用测试条件,让他们将一种工具与另一种工具进行比较,通常最大化特定的客观指标并减少不同实验的可变性。例如,通常禁用码率控制和主观质量调节,以专注于核心编码工具的有效性。

Netflix编码配方专注于实现最佳质量,支持可用的编码器工具,增强主观质量,从而减少编码速度或编码器占用内存空间等指标的权重,尽管这些指标在其他应用中至关重要。

方法

编解码器标准化中的测试方法建立了明确定义的“通用测试条件”,以评估新的编码工具并允许实验的可重复性。常见的测试条件包括一组相对较小的测试序列(1到10秒的单次拍摄),这些测试序列仅在输入分辨率下使用一组固定的质量参数进行编码。针对这些质量点中的每一个收集的质量(PSNR)和比特率,并用于计算平均比特率节省,即所谓的BD率,如下图所示。

Netflix:我们是如何评估Codec性能的?

虽然标准中的方法已经适用于其预期目的,但在自适应流媒体界中还需要考虑其他因素。值得注意的是,可以选择以不同的比特率和分辨率提供相同视频的多个版本,以匹配网络带宽和客户端处理和显示功能。内容,编码和显示分辨率不一定捆绑在一起。去掉这个约束意味着可以通过以不同分辨率进行编码来优化质量。

Netflix:我们是如何评估Codec性能的?

每个分辨率码率 - 质量曲线交叉,因此每个编码分辨率都有一系列码率可以提供最佳质量。通过在整个范围内选择每个码率点的最佳曲线来导出“凸包”。然后,在凸包上计算BD-rate差,而不是使用单分辨率曲线。

Netflix:我们是如何评估Codec性能的?

与单一分辨率相比,这种考虑多分辨率的灵活性带来了非常显著质量提高。动态优化器(DO)方法将此概念推广到具有多个场景的序列。DO对视频中所有场景的凸包进行操作,通过寻找质量,分辨率和场景编码的最佳压缩路径,共同优化整体码率 - 失真。

DO是在这个技术博客(https://medium.com/netflix-techblog/dynamic-optimizer-a-perceptual-video-encoding-optimization-framework-e19f1e3a277f)中介绍的。结果显示多场景视频可以节省25%的BD-rate。使DO特别适用于自适应流和编解码器比较的三个特征是:

  1. 它与编解码器无关,因为它可以以相同的方式应用于任何编码器。

  2. 它可以使用任何指标来指导其优化过程。

  3. 它消除了对编码器中各种场景之间的高级码率控制的需要。较低级别的码率控制,如帧内的自适应量化,是仍然有用的,因为DO不会低于场景级别。

DO,如最初提出的,是一种非实时的,计算代价高昂的算法。然而,由于穷举搜索,DO可被视为高层码率控制算法的性能上限。

内容

为了公平比较,测试内容应该要平衡,涵盖各种不同类型的视频(普通视频与动画片,平缓运动和复杂运动等)或者反映当前应用的内容。

在编解码器的开发过程中不应使用测试内容。Netflix制作并公开了多场景长视频序列,例如“El Fuente”或“Chimera”,以扩展可用于研发的视频,并缓解将训练和测试内容混淆的问题。在内部,我们使用目录中的完整标题广泛地评估算法。

度量

传统上,PSNR因其简单而成为一个度量标准的选择,并且它与主观意见得分相当匹配。其他指标,如VIF或SSIM,与主观得分有更好的相关联。度量通常是根据编码分辨率计算的。

Netflix 在整个视频生产线中高度依赖VMAF。VMAF是一种感知视频质量度量标准,用于模拟人类视觉系统。在广泛的质量范围和内容上,它与主观意见的相关性比PSNR更好。VMAF可在自适应流传输中的各种比特率和分辨率上实现可靠的编解码器比较。此技术博客(https://medium.com/netflix-techblog/vmaf-the-journey-continues-44b51ee9ed12)有助于了解更多有关VMAF及其当前部署状态的信息。

Netflix:我们是如何评估Codec性能的?

VMAF值与主观意见之间的近似对应关系

使用度量标准时的两个相关方面是计算它们的分辨率和时间平均值:

  1. 缩放度量:VMAF不是以编码分辨率计算的,而是以显示分辨率计算的,这更好地模拟了我们的用户观看体验。这并不是VMAF所独有的,因为PSNR和其他指标可以通过适当缩放视频应用于任何需要的分辨率。

  2. 时间平均:度量是基于每帧计算的。通常,算术平均值是获得整个序列的时间平均值的一种选择方法。我们使用调和平均值,它给异常值提供了比算术平均值更多的权重。使用调和平均值的原因是,如果在你正在观看的节目的镜头中有很少的帧看起来很糟糕,那么不管剩下的镜头质量有多好,你的体验都不会那么好。调和VMAF的首字母缩写词是HVMAF。

编解码器比较结果

将上述因素应用到实际中,我们给出了两种不同的编解码器比较方法的结果,一种是传统的,另一种是自适应流媒体的。

测试了三种常用的视频编码标准:ITU.T和ISO / MPEG的H.264 / AVC和H.265 / HEVC以及Google的VP9。对于每个标准,我们使用参考编码器和产品编码器。

采用传统方法的结果

传统方法对一组短序列使用固定QP(质量)编码。

编码器设置如下表所示。

Netflix:我们是如何评估Codec性能的?

方法:生成内容分辨率下每个序列的五个固定质量编码。

内容:来自MPEG通用测试条件集(主要来自JVET)的14条标准序列和来自开放媒体联盟(AOM)的14条标准序列。所有序列都是1080p。这些是短片段:MPEG集约10秒,AOM集约1秒。大多数情况下,它们是单场景序列。

度量标准:使用经典的PSNR为亮度分量计算BD-rate节省。

结果总结在下表中。BD-rate是相对于x264的百分比给出的。正数表示比特率的平均增加,而负数表示比特率减少。

Netflix:我们是如何评估Codec性能的?

使用6个PSNR调谐视频编码器的PSNR的BD-rate(%)

有趣的是,并没有看到使用MPEG集会有利于HEVC编码器,或使用AOM集会有利于VP9编码器。

自适应流媒体视角的结果

本节介绍一个更全面的实验。它建立在传统方法之上,修改了每个因素的某些方面:

  • 编码器设置:更改设置以包含感知调整。其余的设置保持原先的定义。

Netflix:我们是如何评估Codec性能的?

  • 方法:每个场景都以10种不同的分辨率进行编码,从1920x1080到256x144。DO使用HVMAF进行整体编码优化。

  • 内容:Netflix的8部完整剧集(如Orange is the New Black、House of Cards或Bojack)被添加到另外两个测试集中。Netflix的这些剧集是1080p,30fps,8位/分量。在大约8小时的视频里面,它们包含了很多类型的内容。

  • 度量:HVMAF用于评估这些感知调整的编码。该度量是在凸包的相关质量范围内计算的。HVMAF是在将编码缩放到显示分辨率(假设为1080p)后计算的,该分辨率也与源内容的分辨率匹配。

此外,我们将结果分成两个范围,以可视化不同质量的性能。低范围是指30到63之间的HVMAF,而高范围是指63到96之间的HVMAF,这与高主观质量相关。

HVMAF BD-rates表中高亮显示的行是Netflix最相关的操作点。

Netflix:我们是如何评估Codec性能的?

BD-rate(以%为单位)使用6个视频编码器的HVMAF调整感知质量。BD-rates百分比使用x264作为参考。

要点

编码器,编码设置,方法,测试内容和度量应在任何编解码器比较中进行详细描述,因为它们会极大地影响结果。如上所述,对测试条件的不同选择导致对编码器的相对性能的不同结论。

考虑到Netflix等服务压缩和提供的大量视频,传统和自适应流媒体方法不一定会收敛到相同的结果,如果视频编码社区在比较中考虑自适应流媒体的应用,这将是有益的。例如,在凸包上计算度量或将HVMAF数添加到报告的度量中相对容易。

就像伟大的食谱一样,视频编码也有核心的元素; VMAF,动态优化和出色的编解码器。凭借这些材料和不断创新,我们正在努力完善我们的配方 - 以尽可能低的比特率进行高质量的视频编码。

精品文章推荐

技术干货:

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

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
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
Wesley13 Wesley13
2年前
java将前端的json数组字符串转换为列表
记录下在前端通过ajax提交了一个json数组的字符串,在后端如何转换为列表。前端数据转化与请求varcontracts{id:'1',name:'yanggb合同1'},{id:'2',name:'yanggb合同2'},{id:'3',name:'yang
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Wesley13 Wesley13
2年前
Java日期时间API系列31
  时间戳是指格林威治时间1970年01月01日00时00分00秒起至现在的总毫秒数,是所有时间的基础,其他时间可以通过时间戳转换得到。Java中本来已经有相关获取时间戳的方法,Java8后增加新的类Instant等专用于处理时间戳问题。 1获取时间戳的方法和性能对比1.1获取时间戳方法Java8以前
Wesley13 Wesley13
2年前
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
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这