卡马克解释VR视频《Henry》5K版本背后的挑战与技术方案
文章相关引用及参考:oculus
解锁更高视频质量和视觉清晰度。
(映维网 2018年06月20日)今天的视频编码者受制于一系列的约束,包括显示器分辨率,视场和压缩率等等。为了把完整的360度,60fps立体视场带到沉浸式视频,Oculus的首席技术官约翰·卡马克实现了一种全新的视频编码技术,其可以解锁更高视频质量和视觉清晰度。在今天这篇文章中,卡马克分享了更多关于这项技术的信息,以及《Henry》5K版本的制作故事。以下是映维网的具体整理。
如果你有兴趣用现有的360度内容来测试这项实验性工具和源播放器,你可以访问Oculus开发者中心并下载SDK样本。
1. 视频瓶颈
在VR中播放传统的“平面”视频通常受制于显示器的分辨率。除非你拥有巨大的弧形虚拟屏幕,1280×720视频已经略微超出了显示器的分辨率,至少在边缘位置是这样。我们需要更高分辨率的屏幕才能真发挥出1080P高清内容。
沉浸式视频是另一个问题。要播放360度60fps的立体视场视频,你所需要的分辨率要高于当前的视频解码器。
显示器的角分辨率没有精确数字,因为观影光学元件使其不均匀,但整个360度上的5120像素是一个很好的近似值。对于当前的VR头显而言,任何超过这个值的数字都只是浪费资源和造成混叠。
沉浸式视频最常见的表现形式是“等量矩形”投影,其中球体将映射至宽高比是2:1的矩形。这是极点上像素使用效率低下的现象,诸如桶形或膨胀立方体等其他投影可以节省一定的成本,但只是百分之几,不是整数因子。
对于立体视场,你需要为每只眼睛都配上这个数字,因此所需的视频总数为5120×5120,速度则是60fps或1500Mpps(像素/秒)。
当Gear VR在Note 4上亮相时,你可以以30fps或240Mpps解码3840×2160视频。如果你在全360度展开,分辨率看起来很不错,但运动并不平滑,而且没有任何深度。如果你想要60fps和立体视场,你只有四分之一的分辨率,而所造成的模糊将令人十分反感。
来到Galaxy S7这一代,视频解码器的性能翻了一番,达到了4K60或480Mpps,这是Oculus Go和最新三星手机的位置。然而,这仍然只是我们目标的三分之一。
如果你愿意牺牲任何一个轴:只是180度而不是360度,只是30fps而不是60fps,或者只是单视场而不是立体视场,这时你只是差50%而已,实际上不算太糟糕。如果你牺牲两个轴,你可以达到显示质量的峰值,而且留有余量:80度,30fps立体视场视频是最直接的方式。大多数相机和工作流程仍无法提供最佳质量的像素,但如果你谨慎注意,或者使用计算机生成的图像,我们仍有可能实现。
如果你要实现完整的立场视场,你需要以某种方式解码视频中对当前视图而言非常重要的部分。
2. 基于视角的视频
今天的VR头显大概有90度视场,所以你视图只是整个球体的六分之一。如果你在一个立方体的中心,正好看着一个面的中间,这时你将无法看到其他五个面。
Oculus的视频解码器可以解码三分之一的世界,而我们实际上只需要六分之一,所以应该有足够的余量,但这仍然有很多挑战。
由于今天视频压缩的方式,你无法解码它的任意一小部分。视频序列被分解为“groups of pictures(画面组)”或者说“gops”,并且只能在完整图片或“关键帧”所在的边界开始解码。其余帧是根据较早帧进行预测,这使得它们更小。大多数视频点播系统都采用3到5秒的gops来实现不错的压缩比。对于1秒gops,关键帧将占用大约25%的文件大小。对于二分之一秒gops,基本上文件的一半都是关键帧。
因为你无法立即改变正在解码的内容,所以你需要对整个360度视图进行低保真编码,因为你可以在几百毫秒内轻松地翻转头部90度。
Oculus最早的视点相关方法是制作视频的20个单独版本,而每个版本都专注于不同地方的细节。最初Oculus采用了“金字塔投影”,然后转到“偏移立方体贴图”。所有这些版本都存储在服务器上,随着你环顾四周,VR客户端将在它们之间进行切换。
gops是1秒,但从互联网传输到传统网络服务器的额外开销将令切换延迟变得更长,而几乎所有人都会注意到它。你会看向一边,而一切都会变得模糊,有时这会持续2秒或更长时间。
为每个视频构建20个不同的版本有很大问题,而且对于将它们全部放在设备上,从而可以在本地播放而不是从服务器进行流式传输而言,这是不切实际的做法。
其他麻烦事项是,任何重采样都将不可避免地降低图像质量。如果主视频是以等量矩形的形式实现,即使其在理论上具有完全相同的像素密度,但将其转换为立方体贴图也会降低质量。
3. 新方案
目前方案中的关键折衷办法是,在球体顶部和底部接受较低分辨率。卡马克这样做的原因有几个:
-
在观看360度视频时,大多数人抬头看或低头看的幅度不会太大。当然,你可以根据这一点稍微拓展开来,并且认为他们向左看或向右看的幅度同样不会太大,而你最终将强烈地认同180度视频,但360度仍然是一个增量值。
-
为了隐藏相机装置,向下的方向通常是黑色。
-
对于3D 360度视频,强烈建议导演避免观众仰视或俯视,因为你必须先减弱立体3D效果,然后才能看到极点和让眼睛往后倒。
-
极点上的不均匀等距投影仍然可以为你提供一定的“额外”分辨率,至少在一个轴上是如此,所以这个bug成为了某种特征。
尽管如此,这实际上仍然是一种妥协,而有些视频在这种格式下效果不佳。一个明显的例子是当你把清晰分明的文字放在天花板或地板上时。作为交换,我们得到的结果是,垂摇角度的视点相关性足够好,这使得系统的数据重复最小,所以这可以支持本地设备,而非仅仅只是大量的服务器。
作为一个基础层,整个5K主视频将重新采样为一个始终可用的2K×2K版本,所以即使你瞬间旋转180度,你总是能看到一些可以意识到的内容。如果你看向天花板或地板,这就是你所能看到的版本。
关键的中心区域直接从5K×5k主视频中进行裁剪,像素到像素,没有重新采样。Oculus将它们分成10个独立的视频文件,每个眼睛512×1024像素列,然后进行堆叠和置换,从而制成2048×512视频条。
总文件大小与传统的5K×5K编码大致相同,因为跳过极点可以平衡额外的gop关键帧和额外的低细节副本。
播放引擎同时解码四个视频流:背景和当前视图中心的三个视频条。随着你环顾四周,三个视频条将在每个gop转换点切换信号源。
我们知道用户不喜欢下载大型应用程序,因此质量和尺寸之间存在比较紧张的关系。《Henry》是用H264编码,CRF 22,半秒gops。如果是为电影节或线下平台准备,而卡马克表示可以将编码预加载到头显上,不会关心下载大小,会采用CRF 18,以及可能是四分之一秒gops。
当前的解决方案支持所有的编解码器,而且这11个视频中的每一个都是完全独立。你可以使用h264,h265,VP9,或者甚至是MPEG-2(目前的工具只支持h264和h265)。理想情况下,卡马克表示会一次解码四个视频条,而不是说三个,但视频解码器的系统软件负载非常巨大,所以卡马克对三个已经感到相当满意。
这是导致视频侧向置换的原因。卡马克尚未实现的方案是,做足够的源码级修改,把所有视频条的样本粘贴在一起,将其作为一个较大帧中的h264/h265“切片”,这样视频解码器仅解码一个较大的视频,而不是三个或四个较小的视频。这将会大大减少负载,而且如果需要,视频条可以变得更窄,因为卡马克表示他可以很容易地将十个“切片”粘贴在一起。卡马克还没有完成这个方案。
对于演示这项技术,《Henry》的表现非常好,几乎所有的画面都能以高细节呈现。尽管如此,它仍然不能代表绝对的质量瓶颈。《Henry》是在数年前的实时渲染限制之内开发而成,而360度视频的捕捉是以非实时的速度完成,设计并使用最先进的离线工具进行渲染可实现更高的质量。
注意:尽管用于捕捉实况片段的多相机装置胡须能够输出非常高分辨率的主视频,但传感器和拼接立体视场主视频之间的多级处理可能意味着,它们无法真正产生比4K高很多的值。
对于这项新技术而言,最常见的第一印象是“哇,好清晰呀。”,但对于这一切,背后还有其他微妙的贡献力量。
要将分辨率放在屏幕上的所有合适位置,Oculus将视频片段放在VrApi层上,而不是绘制到传统的眼睛缓冲区。无论你使用何种分辨率,通过眼睛缓冲区的额外过滤步骤始终会降低质量。
对于在VR中直接纹理映射视频,其提供的是线性过滤,而不需要你想要的sRGB过滤。对于低分辨率的视频而言,这并不重要,但当你采用诸如文本这样的高分辨率和高对比度元素时,这将产生非常大的差异。由于必须复制这些视频条,然后将它们组装成连续的区域,所以卡马克也借此机会采用了sRGB纹理。
几乎所有的视频播放器都会令视频帧速率匹配音频上的时间同步,从而导致视频播放中出现卡顿,这在60 fps时尤为明显。在这里,卡马克坚持为每个显示帧准确地释放一个视频帧,而且细微地重新采样音频以保持同步。《Henry》没有非常明显地表现出这一点,但任何存在持续运动的画面都可以从中受益。
Audio 360空间化音频是在低延迟音频快速路径中按需完成,因此它的响应速度比默认实现要快得多,不会给音频定位带来明显的延迟。
对于过去数年间制作的大量高端360度作品来说,我们一直以来都只能以糟糕的画质来进行观影,而要解锁其尘封已久的真实质量,这样的前景令卡马克感到非常兴奋。现在是时候抹去它们身上的灰尘了。