在 HEVC 比特流中简化 MPEG 沉浸式视频传输

2021-12-27 16:24:08 浏览数 (2)

来源:SPIE2021 作者:Mengyu Chen, Basel Salahieh等 内容整理:胡经川 本文介绍了一种简化的 MPEG Immersive Video 传输方法,利用了 HEVC 码流中的 SEI 消息语义来传输多视角纹理视频以及深度信息。此外还基于开源的 VLC 播放器开发了一套可以实现面部跟踪的自由视角播放器用于验证传输策略,它支持在观众选择的任何观看位置进行实时视角合成。

目录

  • MPEG 沉浸式视频及标准
  • 简化 MIV 视频的传输
  • 自由视角视频播放器
    • 主要组件
    • 视频数据同步
    • 渲染(视角合成)步骤
  • 实验结果

MPEG 沉浸式视频及标准

沉浸式媒体在今天得到了广泛的关注,学术界已经做出了巨大的努力来探索和解决其技术挑战。ISO/IEC MPEG 牵头的沉浸式音频、图像和视频信号编码表示的标准化工作已经得到了非常积极的发展。MPEG Immersive Video(MIV)旨在压缩由多相机捕获的3D场景表示。MIV标准通过播放摄像机拍摄的3D场景,实现高保真的身临其境体验,为观众观看的位置和方向提供六个自由度(6DoF)。随着MIV标准在2021年7月实现技术层面的完成,越来越多的工作希望探索实时沉浸式视频播放和流媒体的能力。

MIV标准的开发旨在满足新兴沉浸式生态系统对数据访问和交付机制的关键需求。它基于可视体积视频 (Visual Volumetric Video)编码(V3C)标准,该标准定义了 MIV 与 MPEG 点云视频编码(V-PCC)之间的共性。比特流格式、配置文件和解码过程都是 MIV 规范的标准范围,而编码和渲染过程是MPEG沉浸式视频相关测试模型(TMIV)中尚未涉及的非标准部分。

图1:TMIV 编码和解码流程

图1显示了 TMIV 软件的编码和解码过程。在编码器阶段,将多个视图(包括纹理和深度信息)及其相机参数(包括位置和方向)输入 TMIV 编码器。TMIV 编码器仅提取重建场景所需的信息,去除冗余信息,并以补丁的形式将其以紧凑的方式打包到视图集中。然后使用所需的视频编码器对视图集进行编码,并且子比特流与相关联的元数据一起复用以形成 MIV 比特流。在解码器端,比特流被解复用和解码,以检索视图集和元数据,并传递给渲染器,渲染器根据观看者的运动以交互方式合成相应的视角。

MIV 可以使用AVC、HEVC、AV1、VVC或其他视频编解码器。此外,它还可以处理任何拍摄系统和任何投影类型以获取真实世界内容或合成内容。此外,MIV 比特流还包括高级语法,用于对齐视图集和相机,从而对视角相关的流进行解码和渲染。此外,MIV具有多种可选特性和操作模式,以支持许多用例。其中一种模式是 MIV 视图模式,如图2所示。在该模式中,编码阶段被简化,此模式选择视图的子集,而不是使用补丁,并且选择的视图被全部打包到视图集中。MIV 还具有可选的帧打包功能,其中纹理和深度可以打包到同一帧中。

图2:MIV 视图模式的处理流程

简化 MIV 视频的传输

在这项工作中,作者提出了一种将 MIV 视频只通过一层 HEVC 码流进行传输的简化方法,将 MIV 的传输简化为单层视频码流的好处是使其适合于传统视频编解码器,并有利于利用GPU和视频播放器中已经优化的支持。在 HEVC 补充增强信息(SEI)中存储 MIV 比特流的所有非视频部分,并将多路视频拼接在一起(使用MIV的帧打包功能),并编码为单个视频的 HEVC 比特流(包括 MIV 和 SEI 消息)。图3说明了传统 MIV 比特流和提出的单层 HEVC 比特流之间的差异。此方法简化了编码和解码操作,避免了在处理多个流时遇到的同步和缓冲问题。利用这种方法来保持与主流媒体的兼容性。值得注意的是,SEI 已在MPEG中被提出,但尚未在 MIV 规范中采用,所以使用的 SEI 消息将作为 HEVC 的 SEI 消息而不是 MIV 的 SEI 消息进行传输。所以建议在 HEVC 规范中定义MIV SEI消息的有效负载类型,但在 MIV 规范中定义 SEI 消息有效负载。在 HEVC 规范中定义有效负载类型的替代方法是使用用户定义的SEI消息。

图3:MIV 视频的单层 HEVC 码流表示

自由视角视频播放器

开发的 Freeport 播放器用于验证提出的 MIV 数据传输的简化方法。此播放器是在开源 VLC 视频播放器上构建的,该播放器采用了 MIV 渲染器的 DirectX 实现,以及用于用户视角切换指令输入的人脸跟踪工具。Freeport 播放器支持端到端沉浸式视频播放体验,其中观众可以简单地打开本地存储的 MIV 比特流或来自传统流媒体服务器的视频流,并从任何期望的观看角度和位置与合成的沉浸式内容进行交互,并实时进行视图合成,以便在 Freeport 播放器中显示的内容可以与观众面部位置相对应的视角相对应。下面将介绍 Freeport 播放器的主要组件、数据同步机制和渲染步骤。

主要组件

Freeport 播放器是基于开源 VLC 视频播放器实现的,并将 MIV 解码和渲染作为插件完全集成到VLC中,另外还附加了人脸跟踪输入模块。可以将 Freeport 播放器分为四个组件:VLC 视频播放器、MIV 解码器、基于 DirectX 的 MIV 渲染器和人脸跟踪模式。

  • VLC视频播放器:使用 VLC 作为视频播放引擎,它为用户界面、流访问、解码、渲染和硬件 I/O 提供良好、可定制的体系结构。VLC 视频播放器本身具有非常清晰的基于模块的体系结构设计,所以调整起来十分方便,支持将 MIV 解码器和渲染器作为单独的模块。VLC 支持视频的硬件解码,它的视频播放接口不仅具有播放、暂停和停止等基本视频播放功能,还支持远程流访问和快速搜索等高级功能。
  • MIV解码器:MIV 解码器作为一个特殊的解码模块集成在VLC中。解码器利用 HEVC 视频比特流的硬件解码,另外还解析 MIV SEI 消息,并将其作为渲染器的单独数据单元。
  • MIV渲染器:MIV 渲染器是作为 VLC 的滤波模块构建的,它将解码的视频内容作为输入,然后根据传递的元数据合成目标视图。视图合成通过 DirectX 11 图形 API 进行硬件加速,并与 VLC 的本机 DirectX 视频处理层无缝融合。视频帧作为 DirectX 纹理传入和传出,并通过计算着色器的几个步骤进行处理,以获得最终的目标视图。根据解码器传递的 SEI 消息,如果对渲染器具有特定指令,则渲染器选择初始化、更新或重新初始化所有GPU资源。
  • 跟踪模式:Freeport player有三种不同的跟踪模式:面部跟踪、设备输入和推荐的姿势跟踪。每种跟踪模式都为观看者提供了一种与沉浸式视频交互的独特方式,允许他们自由选择目标摄像机姿势,并从不同的位置和角度观看内容。除了推荐的姿势跟踪模式之外,其他两种模式都允许选择实时查看内容的位置。设备输入模式允许用户使用鼠标和键盘移动目标摄影机视口。当观众希望自由探索沉浸式内容时,它提供了精确的控制,效果最佳。“面部跟踪”模式会主动跟踪观察者的脸部位置,并相应地更改目标视口。其中使用 OpenCV 的基于 DNN 的人脸检测器获取人脸位置数据,并将其映射到虚拟空间中的位置。人脸跟踪模式与设备输入一样准确、响应迅速,提供了一种直观、自然的方式与沉浸式内容进行交互。

视频数据同步

图4显示了不同类型的数据如何在不同的硬件组件上同步。在解码 MIV 比特流之后,MIV解码器将解码的视频数据发送到MIV渲染器。视频组件直接作为GPU图形资源进行传递,非视频组件在CPU上处理。CPU上的预渲染阶段会调用面部跟踪模块来收集观看者的姿势,同时调用元数据解析器从非视频组件中提取 MIV V3C 数据。在解析和人脸跟踪之后计算每个相机的权重。一旦所有CPU资源就绪,它们将上载到图形GPU内存,并将在渲染过程中的不同步骤中使用。

图4:数据同步机制

渲染(视角合成)步骤

每次渲染器从 MIV 解码器接收到解码后的 MIV 数据时,它会将非视频组件(例如相机参数和渲染器设置)转换为 GPU 兼容的缓冲区对象,并将它们拷贝到 GPU 设备内存,为 DirectX 11 的视图合成做准备。视频数据的子比特流由 MIV 解码器直接作为 GPU 纹理和着色器资源传递,因为它们已在前面的解码步骤中由 GPU 处理。在为着色器正确注册所有着色器资源后,渲染器将逐步调度所有着色器以合成最终视图纹理并将纹理对象传递到最终视频输出窗口。计算着色器由 8 个步骤组成,每个步骤都使用单个线程组中的最大线程数 (32x32x1) 进行调度,以最好地利用 GPU 上的大量并行处理器。图 5 简要概述了视角合成的主要渲染步骤:

图5:视角合成步骤

  • 解包视频帧:由于纹理图和深度图被打包在一起,因此第一步是将它们恢复并分离到不同的读/写缓冲区中。如果深度图的分辨率低于纹理图,着色器还将对深度图进行简单的线性放大。当着色器访问输入帧上的每个像素时,它还会从元数据中读取放大的补丁映射,并将每个像素与补丁 ID 相关联,其中补丁和视角参数信息可以在像素级别相应地检索。
  • 恢复修剪过的视图:此步骤根据每个像素的补丁信息从纹理图中提取修剪后的视图,并按照视图顺序对像素进行重新排序。如果恢复的深度图需要进一步细化,这一步还会调用额外的函数来对由线性放大引起的边缘模糊进行平滑处理。恢复的修剪视图的数量取决于设置的视角合成所需的视图数量。根据每个视图的相机外参,视图按其姿态根据最终目标相机中的可见度进行排名。只有在最终视图中具有最高可见性的视图才会被选择。
  • 反投影和重投影视图:基于固有的源相机参数和每个输入视图的深度图,这一步中的所有源视图像素首先从图像坐标 Unproject 到 3D 世界坐标。在根据它们的相机外部参数对齐每个输入视图的 3D 世界坐标之后,着色器然后使用内部目标相机参数将 3D 坐标中的所有像素 Reproject 到目标相机平面上的新图像坐标。由于此步骤中涉及的每个相机都可以有自己的相机类型(透视、等距柱状或正交),因此为每个视图选择匹配的反投影和重投影方程以正确转换坐标。
  • 生成目标视角深度图:在获得上一步的结果(即每个源视图的目标摄影机平面上的一组新图像坐标)后,此步骤的着色器使用基于前向映射的光栅化来获得每个视图的扭曲后的高质量深度图。前向映射过程包括评估每个像素对相邻像素的深度值贡献权重,然后对所有点进行光栅化。此步骤的结果是来自每个源视图的一组扭曲后的深度图,每个输入视图的像素将位于目标摄影机平面上的位置。一旦所有扭曲的深度被计算出来,根据源摄像机的姿态为所有深度图分配权重。权重的计算是基于以下因素的组合:源视图位置和目标视图位置之间的距离以及两个视图的前轴之间的角差。两个视图的前向轴之间的角度差。基于扭曲的深度图及其分配的权重,产生一个可见度图。可见度图从所有的深度图中选择最佳的候选者,以生成一个更完整的深度图,可以在最终的目标视角中最好地表现深度值。这个选择过程包括对所有的深度值进行排序和对一些加权值进行混合。
  • 计算着色纹理图:给定一个完整的深度图,着色器将其作为参考,找到每个源视图中的原始像素,并提取颜色值来计算最终的着色纹理图。每个源视图的像素值根据它们的相机权重与可见性图一起混合到目标视角中。该着色器还会检查轮廓,并试图消除重影。如果在某一像素位置没有有效的深度,着色器会从修补过的的背景视图中提取一个颜色值来填充空点。这样,最终的目标视图就能尽可能地完整。
  • 修复和渲染:最后一步是检查目标视图中未填充的点。这些未填充的点来自源视图之外的像素或被前景内容遮挡的像素。这样的像素区域在任何输入源视图中都不可见,因此需要修复器进行估计和填充。此步骤的着色器使用双向的修复方法,尝试在垂直和水平方向上查找有效的相邻像素。一旦找到有效的像素,修复器将根据到中心的距离计算的权重并混合得到最终的颜色值。目标视图完全填充后,包含视图的纹理对象将传递到渲染片段着色器并显示在屏幕上。

实验结果

本节通过比较不同压缩量化参数(QP)值下的播放性能来描述Freeport player的实验结果。Freeport播放器的演示可以在 https://www.youtube.com/watch?v=UeT_Xm1jBGs&t=1015s 观看。

测试序列为因特尔的Frog序列,这个序列中的源视图是由7台按照从左到右顺序排列的相机阵列捕获的。还包括从源视图中预先提取的的背景视图,并与视频组件打包,作为仅用于修复目的的第八视图。序列的测试长度为300帧,帧速率为30fps。源视图分辨率为1280x720,采用 YUV420 的 10 bit 纹理格式。7个源视图和用于修复的背景视图以4x4格式打包在一起,如图6所示。视频组件的分辨率为2560x5760。

图6:Frog序列

使用量化参数(QP)10、18、22和28对序列进行压缩。因此,总共生成了4个视频文件并用于测试。对于每个比特流,我们还将渲染器设置为使用2、4或7个源视图进行目标视图合成。在渲染过程中使用更多视图时,质量通常会提高,但增加视图数量需要更高的计算复杂度。一共在12种不同的条件下测试了性能。

性能测试主要分为两部分:1)解码器、渲染器和显示阶段的FPS测量,2)每个计算着色器步骤的时间消耗。该测试在配备了Intel Core i7-9700 CPU和Intel Xe Max GPU的PC上进行

表1:解码器、渲染器和显示的FPS表现

表1显示了解码器、渲染器和显示阶段(解码器 渲染器)在不同QP级别使用不同数量的视图进行视图合成的平均FPS。在解码器端,我们可以观察到 QP 和 FPS 之间的相关性。更高 QP 值预计将产生更高的 FPS,这可能是由于比特率差异。在渲染器方面,用于视图合成的视图数量对性能有很大影响。使用更多视图意味着在每个着色器步骤中要计算的像素数更多。渲染器使用的计算着色器将需要调度更多的线程来处理所有像素,因此在最终视图渲染之前需要更长的等待时间。显示FPS基于解码器和渲染器性能,在QP=28、22和18使用2个视图实现了实时性能,在QP=28使用4个视图也实现了近实时性能

表2:各模块的运行时间

表2显示了使用2、4和7参考视图时渲染过程中每个着色器步骤的时间消耗及其所占总时间的百分比。我们发现,在所有情况下,计算成本最高的步骤是步骤0、步骤2和步骤3。与其他步骤相比,步骤0具有最多的线程组,因为它需要将整个输入图集解包到单个缓冲区中,并执行大的内存写入和复制。步骤2和3是算法上最复杂的步骤,因为着色器在 2D 和 3D 坐标之间来回转换所有输入视图的像素,然后在每个源视图上进行曲面前向映射和光栅化。用于视图合成的视图越多,它们需要在这些视图上完成每个像素的映射的时间就越多。类似地,在步骤6中,最终视口着色要求着色器遍历所有输入视图,并通过其权重混合所有有效颜色像素。因此,在使用更多视图进行视图合成时,在这一步骤中也可能会看到更高的时间消耗。

最后附上演讲视频:

http://mpvideo.qpic.cn/0bc3maad4aaadiaenv6fxzqvaygdhzqaapqa.f10002.mp4?dis_k=8920dcb65d5bcc6d8d60e06030ea5aa9&dis_t=1640593391&vid=wxv_2193438381701988358&format_id=10002&support_redirect=0&mmversion=false

0 人点赞