与Google、苹果和微软不同,Mozilla的Firefox并没有庞大的生态系统照看和支持。不过这并不能妨碍Firefox Quantum取得广泛的好评。Firefox的拥趸疯狂的支持这家拥抱开源、开放的科技公司。Mozilla也是AV1和WebRTC重要贡献者,在LiveVideoStackCon 2018大会上,Google多媒体组的Zoe Liu称赞了Mozilla的贡献。

作为下一代免专利费、开源的编解码器,AV1被认为将给互联网上的多媒体开发和应用带来广泛影响。本文来自Mozilla研究主管Michael Bebenita,他在浏览器上实现了视频流分析,帮助Codec开发人员快速分析性能,定位bug。LiveVideoStack进行了摘译,点击『阅读原文』访问原文链接。如果你有兴趣利用业余时间为LiveVideoStack贡献,欢迎申请成为的社区编辑,你可以通过LiveVideoStack微信公众号内回复『社区编辑』了解详情。

文 / Michael Bebenita

译 / 蒋默邱泽

码流密码是什么(在浏览器中分析AV1码流)(1)

  • 参考这里:http://aomedia.org/contributor-guide (如果你想帮忙,我建议你参照这样做)

  • 查看与要分析的编码视频兼容的编码解码器的特定修订版本。

  • 构建并运行假想的本地分析程序。

  • 如果你想分享一些分析结果,截图并分享,或者要求同时重复第1步到第3步。当然,他们不太可能这样做,因为它不止一次点击那个文档。

  • 也许我是在一家浏览器公司工作,所以我可能会有偏见,但我认为这是最好基于网络分析方式。

    Emscripten通常用于将游戏或C / C 库移植到网络上,这实际上并没有什么大不了,但如有稍微的差别也许是我从未测试过而已哈。我们使用Emscripten来使我们的持续集成构建控件可运行和可分享,这是有多酷?超便利打败本地分析!!

    玩转分析器

    所以让我们用码流分析来看看,下面我们将比较这两个流:crosswalk_10.ivf和crosswalk_60.ivf。这两个视频采用相同版本的编码器进行编码,分别为10和60 QP(数量越少,质量越高)。分析器将块的细节可视化为一组叠层来观察。

    码流密码是什么(在浏览器中分析AV1码流)(2)

    人行横道 第1帧@10 QP

    码流密码是什么(在浏览器中分析AV1码流)(3)

    人行横道 第1帧@60 QP

    块拆分层

    AV1中的最大块大小为64x64,最小为4x4。(有实验说可以扩展这个范围。)编码器使用大量的因素来决定如何递归地划分64x64块。但总的来说,我们可以从下面的图片中看到,细节更多的区域的块大小更小,细节更少的区域的块大小更大。在质量较低的设置中,平均块大小比较大些,但只适用相同的一般情况下。块的大和小很重要,因为这是编码器跳过信号信息,运动矢量,预测模式,变换类型和其他类型信息的水平。块尺寸越小,编码器可以发送的信息越多,但这也意味着编码器会消耗更多的比特位来显示这些细节。

    码流密码是什么(在浏览器中分析AV1码流)(4)

    块拆分情况-人行横道 第1帧@10 QP

    码流密码是什么(在浏览器中分析AV1码流)(5)

    块拆分情况-人行横道 第1帧@60 QP

    视频的第一帧是一个帧内帧(Intra-frame coding),这意味着每个块是从它周围的块(从上至下)在空间上进行预测的。视频的第二帧是一个帧间帧,这意味着它是从帧之前(或之后)的帧中暂时预测的。对于第二帧(下面)的块拆分决定是有趣的,它们只反映在两个帧之间变化的图像区域。前景中两个人的头向右平移,所以改变的区域围绕头的轮廓。面部虽然向右移动,但不需要细颗粒度的块,因为它可以从前一帧粗略地预测,而头部周围的区域反而不能。

    码流密码是什么(在浏览器中分析AV1码流)(6)

    块拆分情况-人行横道 第2帧@60 QP

    分析可以将每个块大小所覆盖的区域绘制成堆积条形图。第一帧是这个视频序列是唯一的,因为它是一个帧内帧。它使用大致相等数量的16x16,32x32,64x64块。其余的帧都是帧间帧数,大部分使用64x64块。有趣的是,这里有一个反复出现的现象。第8帧、16帧、24帧块中似乎没有32x32块。我很想知道为什么?这些应该分析器要发现的问题。这有可能是编解码器的正常操作行为,也可能是一个错误导致。

    码流密码是什么(在浏览器中分析AV1码流)(7)

    块拆分情况 - 人行横道画面,共32帧@ 60 QP

    在10QP,这看起来不同,但有点类似。

    码流密码是什么(在浏览器中分析AV1码流)(8)

    块拆分情况 - 人行横道画面,共32帧@ 10 QP

    预测模式层

    每个块都有一个预测模式。对于内部帧,这些包括定向预测模式,在每个块内绘制为细线。彩色块使用DC_PRED(粉红色)和TM_PRED(蓝色)。

    码流密码是什么(在浏览器中分析AV1码流)(9)

    帧内预测模式 - 人行横道画面,第1帧 @ 60 QP

    如果通过点击中心来放大中心女士的眼睛,我们可以清楚地看到这些编码决策最终产生的预测模式和编码伪像。如下图

    码流密码是什么(在浏览器中分析AV1码流)(10)

    帧内预测模式 - 人行横道,第1帧 @ 60 QP

    码流密码是什么(在浏览器中分析AV1码流)(11)

    帧内预测模式伪影 - 人行横道,第1帧 @ 60 QP

    帧间帧没有方向预测模式:白色(NEWMV),蓝色(NEARMV),紫红色(NEARESTMV)和紫色(ZEROMV)。

    码流密码是什么(在浏览器中分析AV1码流)(12)

    国际预测模式 - 人行横道画面,第2帧 @ 60 QP

    块信息详细信息

    您可以通过点击获得有关块的更多信息。例如,点击左上方的紫色块(0x0)显示以下块详细信息

    码流密码是什么(在浏览器中分析AV1码流)(13)

    这是方便的方法来弄清楚什么颜色的意思。

    运动矢量图层

    帧间的块可以从其他帧预测。每块可以有2个运动矢量在这里显示为红线和蓝线的组合。颜色的强度代表矢量的大小。每个矢量都是可以预测块内容的偏移量。矢量越长,运动就越多。

    码流密码是什么(在浏览器中分析AV1码流)(14)

    运动矢量 - 人行横道画面,第2帧 @ 60 QP

    位统计层

    在AV1中,无论何时从比特流中读取符号,解码器都跟踪用于表示该符号的比特数。位记帐信息具有块级上下文,这意味着分析器可以确切地确定在每个符号类型的块上花费了多少位。在下表中,该位计费信息被聚合在整个帧上:458个read_mv_component符号采样被读取,总计537比特或28.5%的量用于对帧进行编码。

    码流密码是什么(在浏览器中分析AV1码流)(15)

    分析器还可以在多个帧中显示聚合的比特信息。 这在比较两个不同的位流时很有用。 这些图表是特地安排的,这样它们在视频之间切换时不会移动,以便更容易发现差别。

    码流密码是什么(在浏览器中分析AV1码流)(16)

    数据统计信息也可以作为图层显示。突出显示的紫色区域表示帧内的位层深度分布。

    码流密码是什么(在浏览器中分析AV1码流)(17)

    位层 - 人行横道画面,1 帧 @ 60 QP

    下图禁用图像使位轮廓计算层更清晰一些

    码流密码是什么(在浏览器中分析AV1码流)(18)

    位层 - 人行横道,1帧 @ 60 QP

    如果我们进入第二帧,我们将会会看到更明亮的彩色区域。默认情况下,颜色比例和强度是根据帧/像素的最大数量/像素数量来计算的。以下是可调整比例:

    • 相对帧:默认情况下,这在分析单个帧内的位分布时非常有用。

    • 相对视频:在视频序列中的所有帧上计算最大比特数/像素数。这在分析整个序列中的位分布时非常有用。

    如果我们看到第二帧,我们会看到它有更亮的彩色区域。这并不意味着它使用更多的数据在里面,这只是意味着帧中的更多的数据量花费在图像的较小区域块。

    当然颜色比例也可以调整,默认情况下分析仪使用具有透明度的热点图比例。蓝色大多半透明,红色区域不透明而已。

    • 单色:单一颜色,透明。

    码流密码是什么(在浏览器中分析AV1码流)(19)

    • 热点图:默认情况下,热图与透明度的颜色比例。

    码流密码是什么(在浏览器中分析AV1码流)(20)

    位层 - 人行横道画面,2帧@ 60 QP

    • 热点图(不透明):热图颜色比例没有透明度。

    码流密码是什么(在浏览器中分析AV1码流)(21)

    位图层 - 热图不透明情况 - 人行横道,2帧@ 60 QP

    位统计层还允许您根据符号类型进行过滤。这对于深入了解特定符号的数据位分布非常有用。例如,下面我们可以看到“read_mv”(读运动矢量)符号的数据位分布。

    码流密码是什么(在浏览器中分析AV1码流)(22)

    位图层 - 热图不透明 - 由“read_mv”过滤 - 人行横道,2帧@ 60 QP

    跳过标志图层

    跳过标志用来表示一个块没有系数。跳过的块被绘制成蓝色,从下面的图片中可以明显看出跳过的块出现在大部分为空的图像区域中。如果我们也覆盖比特核算层,我们可以看到大多数比特花费在非跳过区域,这是可以预判的部分。

    码流密码是什么(在浏览器中分析AV1码流)(23)

    下一步还剩什么呢?

    Emscripten解码器其实使用起来足够快了,但它可以优化的更快。在高位深度模式下编解码器使用64位计算,需要在asm.js中模拟因为它缺少64位整数计算方式。我所知道影响性能约10%~20%。另一方面WebAssembly支持64位计算,一旦移植没问题我们将切换到WebAssembly。

    如你所愿,AV1有大量的SIMD代码路径。至少我们做法是禁用分析器架构中的所有SIMD。

    如果您不想在浏览器中测量原始解码性能,你可以试试这个基准测试链接。在我的机器上,Firefox需要512毫秒来解码15帧,Chrome需要719毫秒和Safari更久需要 1044毫秒。

    另外一个性能问题是YUV2RGB的转换。这类代码使用浮点计算,需要另外进行优化。

    如果你想趁热了解AOM进展请看下面这个视频https://youtu.be/lzPaldsmJbk

    ,