全景图片、视频在新浪微博的实践

LiveVideoStack 2020年5月22日

此次演讲的内容分为四个方面:


  • 介绍微博选景产品

  • 分析全景生产展示的原理

  • 解答全景中的挑战与实践经验分享

  • 展望未来的工作

相对而言,全景图片和视频所包含的信息更为丰富,可为用户带来沉浸式的体验,但相比普通的图片和视频,也会面临更多的挑战。例如:全景图片和视频需要的清晰度和分辨率更高,文件会很大,带宽成本会提高,展示需要的加载时间更长,设备解码的消耗也会更高,这些都对高质量的全景体验形成了挑战。本次分享将主要围绕微博全景在处理这些挑战时的一些实践经验而展开。


一、微博选景产品的介绍



微博全景产品应当是一个能为用户带来身临其境消费内容的产品,主要包括两种形式:一是全景视频,一是全景图片。



这两年VR的进展非常大,国内外的视频厂商都在布局,尤其是最近。例如,在2017年3月30号的时候,Facebook甚至向所有用户开通了全景直播功能。



通过上图我们可以看出,生产侧的拍摄设备已经颇具规模。如今市面上有许多的专业级设备和消费级设备,而消费级设备的价格也在逐渐平民化。同时,内容生产方面也有许多专业的内容生产者,源源不断地提供全景或是VR方面的内容。而在消费侧,许多观看硬件的生产商足以保证用户的观看体验。


鉴于微博是一个有着诸多用户的社交平台,我们希望能将其打造成一个用于全景内容消费和传播的平台,将生产与消费有机的结合起来。目前的交互方式比较传统:一种是通过手势交互,还有一种是通过传感器,借助手机感应,控制用户可以看到的全景图片视野。我们并没有选择以双目观看的方式交互,原因在于目前这种方式还有许多缺陷,包括重影、眩晕等问题,佩戴舒适性也不够,最终我们选择了成本更低、更为安全的方式,为用户直接展现全景内容。


二、全景生产展示的原理



全景的传统生产展示方式,最早都是通过硬件相机来实现的,比如旋转镜头或者广角镜头等设备。这种通过硬件拍摄全景图片的方式,一来十分昂贵,二来也达不到上下180度、左右360度的全景视野需求。如今的通用做法是通过多张图片拼接成全景图片,这些素材图片是可以同时采集的,可通过多个相机从不同的角度采集,也可以通过单个相机围绕镜头中心旋转拍摄多张照片。



不过,在拼接全景图片时,我们并不能直接对素材图片进行拼接,一般要将这些图片投影到一个3D的平面上。这样做的原因在于:图片在拍摄时取自不同角度,如果直接拼接会存在很大扭曲,影响最终效果。因此,当我们将其投影到一个3D平面之后,就可以对其进行拼接了。这里以柱面为例说明:



通用拼接步骤如下:



首先我们要对两张待拼接的图进行检测,找出它们的特征点,然后进行匹配。根据匹配结果,计算出两幅图之间的一个变化矩阵,再根据变化矩阵对原图进行形变。如上图所示,如果直接对图片进行拼接,会有很明显的缝隙。因此最终还有一个步骤,就是融合处理。最终我们可以得出类似下图这样的一个3D的全景图。



上面列举了图片的全景图生成步骤,全景视频的生成方式类似。


那么在得到3D图片之后,还有一个问题存在:展示的视野是如何得出的?其实很简单,就是模拟人眼观看3D物体的一个过程,即从一个3D的空间,投影成一个2D成像的一个全面的过程,也可以理解成将3D全景图反投影回一个二维观看平面。



最终展现到我们视野里的,就是刚才那一幅二维的局部视野图。



上面介绍了三维全景图的生成过程以及展示过程,还有一个遗留问题,那就是3D全景内容的存储和编码目前还没有统一的标准。业内一般的做法是通过投影的方式,将其转换到二维平面上,再将其作为普通图片进行编码、传输和存储。具体转换的方式很多,其中等距柱面体的支持设备较多,因此可默认为标准。



三、全景中的挑战与实践经验


下面我们会分享一下在全景中遇到的一些挑战,以及我们的解决办法,这也是我们本篇分享的重点。


全景内容最主要的挑战在于文件的大小问题:想要达到一定的观看体验,就需要非常高的分辨率支持。由于全景文件包含的信息更多,全景文件通常比普通多媒体文件大5倍,这意味着带宽成本会大大增加、加载速度也会变慢,因而用户体验也会受到非常大的影响。所以,我们需要想办法在保证图片视频质量的前提下,尽可能减少全景图像的大小。


上一节提到过:全景内容默认的投影方式,是从3d到2d的投影方式,一般是这种等距柱面体。通过分析不难发现,由于等距柱面投影后的全景图上下两端被拉伸,存在很大的冗余。因此,我们首先考虑把输入的全景图片或视频转化成其他冗余更少的投影模型,从而降低全景文件的大小。



我们解决问题的基本思路是:通过尝试不同的投影方式,与原始的等距柱面体比较,根据质量与体积的不同,折中选出最适合我们业务的一种模型。在这个过程中,我们参考了Facebook的立方体模型。Facebook的基本思路是将一个球面投影到一个立方体的六个面上,其中顶部的25%和底部的25%分别投影到立方体的上下两个面上,其余剩下的50%则投影到立方体剩下的四个面上。



这样做的优势在于:图片上下两极是没有扭曲的,这样对于视频的编码也很有利。而且通过比较,我们可以分析出,相比原本的等距柱面体,这种立方体的投影模式体积可缩小25%。



刚才主要讨论了成本优化的问题,下面我们讨论一下全景图片展示中分片加载的问题。一般来说,全景图片都非常大,在展示时也会受到一定限制。由于OpenGL允许加载的图像大小有限制,显存大小也是有限的,如何尽可能用最少的客户端资源将其展示出来?我们的做法是,根据当前Viewport的变化加载相应视角的纹理,动态调整不同面的图像清晰度。也就是说,调高当前视野中的图像清晰度,降低不在视野中的部分。通过这种方式,我们有效地减少了资源的占用。



刚才还有提到,从3D到2D的转化过程涉及多种模型,那么怎样衡量不同模型的优劣,怎样对比不同的模型呢?同时,3D视频一般都非常大,因此编码的过程至关重要,那么如何调优,怎么确定什么参数适合这样的全景内容呢?


我们想要找到合适的评价方式来对这种全景内容进行对比,但是直接用编码前的等距柱面体与编码后的等距柱面体进行对比是不合理的,因为用户最终观看到的是某一个视野的一张图片。比较合理的方案是分别在两种不同模型下,生成同样视野的图片,分别进行比较,最后取平均值作为最终的质量评价。



但这样做对计算量的需求非常之大,我们一般会对其进行简化,不去计算所有视图的点。实际操作中,我们会根据某个点,比如六面体中的P点,通过对应其在3D球面上的变化关系,找到它在原始等距柱面体中的位置,也就是P节点。根据两个点计算得出它们之间的差异,就可以将六面体上所有点的质量计算出来,计算得出的平均值就是我们想要的结果。其中有一个问题,我们在观看3D场景的时候,会随着手势的滑动切换不同的视角,然而有些视野是一直都是看不到的,比如说球的两极。但是其重要性并没有那么高,我们会根据用户观看的位置不同进行加权。下面这幅图就是一个加全后的案例:



四、未来的工作


之前介绍的几个模型都是质量均匀的,其在各个面上的投影质量都是均匀的。这样的话,如果用户只观看当前的视野,而不去观看其他的面,就会造成很大浪费。目前在这方面Facebook一直走在前面,它一直在做一些探索,也推出了一些新的模型。其基本思路就是:根据视口,也就是用户观看的视野,自适应地下发一些这个视野下的图片或视频内容。


这样的模型都是基于局部的全景图像,在各个面上的质量分布并不均匀。比如图21中右上角,其底边和质量都是原始的质量,剩下的四个面则是一些低质量的图片。视野转换时,系统会请求另外相应视野所对应的流,通过这样的过程,动态加载所需的视野,从而降低带宽损耗,其效果能达到80% 的带宽降低。



去年年底的时候,又有一个新模型提出,也是基于立方体的,能够达到92%带宽节省,这个模型应当非常适合直播领域。如果做全景的话,这个也是我们后面会尝试的一些方法。

还可输入800
全部评论
作者介绍

刘文

新浪微博

高级多媒体开发工程师

文章

粉丝

视频

相关文章
阅读排行
  • 2周
  • 4周
  • 16周
热门视频

WebRTC视频数据流程分析

许建林/《WebRTC Native开发实战》书籍作者