技术专家Mike Swanson:对苹果鱼眼投影格式的分析与测试(二)

VR陀螺


    编译/VR陀螺
    Mike Swanson是一名技术专家,曾在微软工作了12年,离职后花费5年时间便携独立iOS应用,后来从2016年初开始,在西雅图的一家沉浸式视频初创公司(名为 Pixvana)持续工作了4年。如今苹果Vision Pro推出后重新激发了人们对视频格式的研究兴趣,为此Mike Swanson分享了他在沉浸式视频领域的经验,以及对苹果鱼眼投影格式的分析与测试情况。
    以下为VR陀螺基于Mike Swanson博客原文编译整理(第一人称视角),略有修改:
    如果您阅读过我此前关于对苹果空间视频的概念以及编码方面的分析与试验,或者使用过我的空间视频命令行工具Spatial,那么您可能还记得曾经提到过的苹果“鱼眼”投影格式,它之所以具有神秘色彩,是因为他们没有详细说明CMProjectionType.fisheye,即他们以这种格式传输沉浸式Apple TV+视频,但他们没有提供使用这种投影类型生成或播放第三方内容的方法。
    相关阅读:技术专家Mike Swanson:详解Vision Pro空间视频与沉浸式视频(一)
     
    
    CMProjectionType.fisheye(图源:苹果) 
    此外,该格式没有记录,苹果没有回答开发者论坛上要求公开更多细节的提问,也没有在WWDC23开发教程中提到它。作为一个在该领域有经验的人并保持着不懈的好奇心,我花时间深入研究了苹果的鱼眼投影格式,这篇文章分享了我在探索相关问题时所学到的知识。 
    正如之前所述,我不是苹果员工,我在这里写的所有内容都是基于我自己的经验(特别是我在2016年至2020年在沉浸式视频初创公司Pixvana的任职经历)以及研究和试验。我深知其中一些信息是不正确的,为此我希望我们都能在WWDC24(6月10日至14日)上获得更多更准确的信息。 
     如何理解球形内容(Spherical Content) 
    此时想象一下自己坐在转椅上,直视前方。如果您再抬头看着天顶(Zenith),则是90度。同样,如果是低头看着最低点(Nadir)也是90度。因此,您在现实中看到的总垂直FOV为90度+90度=180度。 
    另外,还是在同一个位置上,向左旋转90度或再向右旋转90度,则可以看到完整的180度的水平FOV。如果再转动椅子看向“后半部分”,就相当于获得了360度的FOV内容。
     实际上当我们谈论沉浸式视频时,通常只提到水平FOV(如180度或360度),并假设垂直FOV始终为180度。当然,这不一定是准确的,因为我们可以随意捕获、编辑和播放任何内容。 
    但是,当有人提到“VR180”之类的名词时,他们实际上指的是具有180度水平FOV×180度垂直FOV的沉浸式视频。同样,360度视频是水平360度×垂直180度。 
    当在苹果Vision Pro、Meta Quest或其他设备中播放沉浸式视频时,内容的显示方式就好比观看者的眼睛位于球体的中心,观看显示在球体内表面的视频。能直观地感受到180度的内容显示为一个半球,360度的内容显示为一个完整的球体。但它实际上可以是介于两者之间的形式;在Pixvana,我们会将其称为任意度(any-degree)视频。 
    那么我们如何对这种身临其境的球形内容进行编码?所有常见的视频编解码器(H.264、VP9、HEVC、MV-HEVC、AVC1等)都是为编码和解码矩形帧之间的数据而设计的。如何拍摄地球的球形图像(即地球仪)并将其存储为矩形呢?对我来说,这听起来像是形容一张地图。事实上,这种转换在制图学中被称为“地图投影”(Map projection)。  
     等距柱状投影格式   
    虽然有许多不同的投影类型,每种投影类型在特定情况下都具备有用的属性。但球面视频和图像最常使用等距柱状投影格式。其转换执行起来非常简单(看起来比实际复杂)矩形图像上的每个x位置表示球体上的一个经度值,每个y位置表示球体上的一个纬度值,这种也可称为纬度/经度(lat/long)投影。 
    想象一下,从赤道开始,在地球仪上“剥离”一度高的条带。要将其转换为矩形,首先将该条带水平粘贴到平面的中间(横向)。然后继续以一度的增量向上或向下剥离和粘贴。一定要把每条带拉伸到和第一条一样长,这意味着北极和南极的非常短的条带被拉伸了很多。但完成后,您将获得一个360度的等距柱状投影,如下图A所示。 
    
    图源:网络 
    同理,从半个地球仪上“剥离”一度高的条带,最终会得到一个180度的等距柱状投影,有时称为半等距柱状投影(half-equirect)。以数字形式,通常为每度的图像数据分配相同数量的像素。因此,对于完整的360度x180度等距,矩形视频帧的图像纵横比为2:1(水平尺寸是垂直尺寸的两倍)。对于180度x180度的视频,图像纵横比为1:1(正方形)。这些不是硬性规定,并且出于技术原因,有时帧会水平或垂直拉伸以适应编码器或播放设备的能力。 
    这是一张180度半等距柱状投影图像,上面覆盖了网格以说明其图像失真变形情况。下图是根据上述原理以标准鱼眼图像创建的。 
    
    图源:Mike Swanson 
    到目前为止,我们所描述的相当于单视场(2D)视频。对于立体(3D)视频,我们需要在每一帧中包含两幅这样的图像(每只眼睛)。通常是通过将两个图像并排或上/下排列来实现的。对于采用上/下排列的完整360度立体视频,将使得最终视频帧的比例为1:1(因为我们现在在两个维度上都有360度的图像数据)。正如我之前在之前的文章所述,苹果选择使用MV-HEVC对立体视频进行编码,因此每只眼睛的投影都存储在自己的专用视频层(layer)中,这意味着视频工具报告的视频尺寸与单只眼睛看到的画面尺寸互相匹配。
     标准鱼眼镜头  
    大多数用于拍摄沉浸式场景的相机都具有一个或多个鱼眼镜头。要拍摄180度立体(立体的简称)视频的相机几乎都是两个鱼眼镜头并排配置,间隔大约63-65mm,与人眼之间的距离相近(例如市面上的VR180相机)。 
    
    佳能双鱼眼镜头(图源:网络) 
    这些相机捕获的原始帧被记录为鱼眼图像,其中每个圆形图像区域代表~180 度(或更多)的视觉内容。在大多数工作流程中,这些原始鱼眼图像会被转换为等距柱状投影或半等距柱状投影,以便最终传输和播放。 
    这是一张180度标准鱼眼图像,图面同样覆盖着网格(也是本文中其他相关图片的来源)。 
    
    图源:Mike Swanson 
     苹果的鱼眼投影格式不同于现有鱼眼格式  
    到这就是这篇文章的主题。正如我在前文中提到的,苹果已经以“鱼眼”投影格式对其沉浸式视频的原始帧进行了编码。实际上我监视了苹果Vision Pro的网络流量,而且我看到了描述每个网络流的HLS流清单(视频点播 VOD)。这就是我最初发现并报告这些数据流的方式:在最高质量的表现中,每眼大约50Mbps,HDR10,4320x4320,90fps。 
    虽然我可以看到流量情况,但我无法查看原始视频帧,因为所有沉浸式视频都受DRM(数字版权管理)加密保护。这是非常合理的,尽管我对苹果鱼眼镜头的原始帧充满好奇,但无法再继续深入研究了,除非有更多对鱼眼投影类型有了解的人进一步作解释,或只能等待WWDC24到来。 
    经好友推荐我联系上了Andrew Chang,他表示也监控了自己的网络流量,并意外地发现Apple TV+的介绍片段(沉浸式版本)是以清晰的方式传输的,事实上它也是以同样的鱼眼投影方式编码的。 
    
    Andrew Chang提到的视频片段(图源:YouTube) 
    现在,我终于可以看到一个原始的鱼眼视频帧了。不幸的是,画面大部分是黑色的,没有特点,只包括一个Apple TV+的logo和一些God rays效果(丁达尔光效)。由于我在实际应用和实验投影类型方面都有不少经验,我想自己再进行研究(但Apple TV+的logo和原始画面的视频不能在此发布)。 
    很快我就发现,仅基于logo的失真变形,苹果的鱼眼投影格式与标准鱼眼录制格式有明显不同。这并不奇怪,因为只在矩形帧中心的圆形区域进行编码,而将其余部分保留为黑色是没有意义的;一般来说会希望使用视频帧中的所有像素来发送尽可能多的数据(如前面所述的等距柱状投影格式)。 
    此外,画面中的logo不是水平对齐的,而是将画面顺时针旋转45度,使其与从画面左上角到右下角的对角线对齐。因为对角线是视频帧的最长尺寸,与完全不旋转的画面相比,它可以存储更多的水平(旋转后)像素。 
    这是将标准鱼眼图像原图转换成与苹果鱼眼投影格式非常相近的格式。 
    
    图源:Mike Swanson 
    从左下角到右上角的对角线表示视频帧播放的垂直维度(旋转后同理),同样增加了可用像素。这意味着,在旋转播放期间,现在的对角线方向应包含最少的图像数据。如果能正确调整,它可能不会太明显,这仍值得注意。 
     关于“额外”像素以及Blender测试 
    您可能会问,这些“额外”像素从何而来?我的意思是,如果我们从相机拍摄的传统原始圆形鱼眼图像开始,然后将其拉伸以覆盖矩形帧,我们得到了什么? 
    这些都是会引申出富有各种可能性答案的好问题。我会将视频处理比作在波音747驾驶舱操作:如果您转动驾驶舱其中一个旋钮,就很可能需要改变其他东西或转动更多的旋钮来平衡它。以此类推,视频处理经常面临这样的优化问题(Optimization problem),为此我在这里列了一些关于答案的初步想法: 
    - 源视频可能是以较高分辨率拍摄的,并且当将视频转换为较低的分辨率时,通过利用矩形帧来保留“额外”图像数据。 
    - 可能相机在拍摄过程中通过光学方式(使用物理镜头)转换了圆形鱼眼镜头图像,以填充更多的矩形传感器捕获的图像数据。这意味着还有额外的图像数据需要处理,而以这种扩展的鱼眼格式存储,可以保留更多的数据。 
    - 同样,如果我们使用两个以上的镜头记录图像,在转换过程中需要保留的数据也会更多。值得一提的是,苹果似乎有用一对双鱼眼镜头拍摄了Alicia Keys的沉浸式视频。 
    除了文中提到的,还有许多其他因素会影响苹果鱼眼投影格式的设计。其中一些包括失真处理、分配给每个像素的区域大小、帧中“最重要的”像素的位置、高频细节如何影响编码器性能、变换帧中的失真运动如何影响运动估计效率、在回放过程中如何对像素进行采样和显示等等。 
    回到原始的苹果鱼眼画面,得知图像代表大约180度后,我通过Blender开始根据可见的失真扭曲猜测回放后可能出现的几何形状。关于这一点,我不确定该帧是否对回放几何体的面进行编码,或者失真是否与另一种数学映射有关。然而,有些失真比预想的要严重,我的大脑无法想象什么样的网格可以纠正这些失真。
    
    在Blender中试验过的众多网格和UV贴图之一(图源:Mike Swanson)
     关于径向拉伸(Radial Stretching)  
    Paul Bourke是投影映射、鱼眼镜头、等距柱状投影图像、相机校准、立方体映射技术等领域的专家,所以我联系了他,看看他是否有任何见解。 
    经过几周的反复讨论,我们都同意苹果的鱼眼投影与一种称为“radial stretching”(径向拉伸)的技术最相似(顺时针旋转45度)。您可以通过文末的文章链接阅读有关技术的更多信息。 
    
    图源:Paul Bourke 
    现在想象一个传统的居中圆形鱼眼图像,它触及正方形框架的每个边缘。类似于我之前描述的地球仪的等距柱状带“剥离”操作,想象一下从图像中心放射状剥离一度宽的条带,并沿相同角度拉伸它们,直到它们接触到方形框架的边缘。顾名思义,这就是径向拉伸。 
    通过在原始苹果鱼眼镜头的帧上执行此操作的反向操作,最终会得到一个相当好看的Apple TV+ logo版本。但这不是100%正确的。似乎在对角线使用了一些额外的逻辑以减少径向拉伸和失真的数量(并且可能使图像数据远离编码角)。我已经尝试了许多方法,但仍然无法实现100%匹配。到目前为止,我的最佳猜想是使用简单的斜角,这与我在早期图像中使用的转换方式相同。 
    
    图源:Mike Swanson 
    这最后一点失真也有可能是用特定的投影几何体形成的,我已经尝试了许多接近的排列组合......但总是不没能达到完全相同的目的。但如果苹果是根据特定的几何图形进行编码,我会稍感惊讶,因为它会给工具流程增加不必要的复杂性并降低整体灵活性。 
    虽然我已经能够使用我所描述的技术播放Apple TV+logo视频,但视频帧在其中心之外缺乏真实的细节。因此,我得到的映射仍然有可能在外围出现问题。我想我会继续祈祷在WWDC24上了解更多信息。
     写在最后 
    这篇文章介绍了我对苹果鱼眼投影格式的技术方面的实验。一路走来,我与多位朋友合作解决细节问题的过程非常有趣。虽然我们无法找到100%正确的解决方案,但相信我们是在可行的范围内,离真正的道路并不远。 
    我还有些问题,为什么有人会选择这种投影格式而不是半等距柱状投影格式。显然,苹果相信这种投影格式有价值,否则他们就不会费心重新建立一个工具流程来捕获、处理和传输这种格式的视频。我可以想象到一些可能的优势,例如本文提到的保存“额外”像素。随着时间的流逝,我相信当现有工具支持他们的鱼眼投影格式时,届时我们能从苹果公司本身和实验中学到更多,而且人人都可以进行沉浸式视频的实验。 
    这是一个激动人心的时刻,感谢苹果能让我们重新审视沉浸式视频。 
    参考链接:对苹果鱼眼投影格式的理解(原文链接):https://blog.mikeswanson.com/apples-mysterious-fisheye-projection/关于球体、圆盘和方形之间的映射:https://jcgt.org/published/0005/02/01/关于方形/圆盘映射(Marc B. Reynolds):https://marc-b-reynolds.github.io/math/2017/01/08/SquareDisc.html)