微信号:qiniutek

介绍:七牛云,开发者的互联网创新加速引擎.

VR 应用在直播领域上的实践与探索 | 架构师实践日

2016-08-18 17:39 孙其瑞

编者按:与传统的手机直播推流不同的是, VR 直播推流往往存在多个采集端,且推流数据的码率远远高于传统的手机直播,这给 VR 直播的技术实现带来了一系列挑战。针对这些挑战,7 月 31 日,在七牛云主办的架构师实践日上,得图网络 CTO 孙其瑞结合多年 VR  行业从业经验,带来了「VR  应用在直播领域上实践与探索」。以下是对他演讲内容的整理。


孙其瑞

得图网络  CTO


2012 年以前从事网游 3D 引擎开发以及游戏支付、电商平台工作。  2012 年后转向 VR 领域,擅长图形图像算法、音视频编解码以及分布式架构。

VR 实时推流的架构与实践



图 1


图 1 是 VR 直播流程。与传统的手机直播推流不同的是,VR 推流可能存在多个采集端,通常手机推流数据最多达到 1024P 或者 1080P,但在 VR 领域 4K 才刚刚起步。因为 VR 的展示跟普通的展示不一样,它是非平面、360 度的,所以会多一个拼接和展示环节。拼接环节会用显卡加速到得图,然后分发到电脑、手机等各个终端,再做展示。这是 VR 直播与传统的直播相比最主要的区别。


在 VR 实时视频拼接中,最大的难点是速度而不是算法,速度决定了算法的优劣。视频拼接的算法一般会在显卡上完成(显卡编程,指的是 GPU 编程,与显卡的思维不一样)。除了实时拼接上的难点,超 4K 直播的推流控制也是 VR 直播中的一大难点。


总结起来,在这个过程中主要遇到如下挑战:


  1. GPU 快速处理优化。

  2. 来自网络的波动。4K 直播对网络要求很高,网络波动时做 4K 直播,无法根据网络进行优化。

  3. 音视频同步。VR 直播时,视频和音频不一样,视频要把 6 路、8 路或者是 12 路进行实时拼接,再加音频口进行混合推流,这时会出现不对等现象。



图 2

如何做到实时拼接? 

  1. 4 路及以上的 1920x1080/30fps 实时处理。一般来说要达到 1920×1080、30fps ,会用 3.0 HDMI 接口。

  2. CUDA 并发处理运算。CUDA 是专门针对显卡进行优化的。

  3. 硬编解码。做 4K 的时候经常会遇到硬编码,也是显卡编码。

  4. 多种输出格式,包括 SDI 切换台、RTMP 流、HTC 眼镜等。SDI 切换台应用比较广泛,比如春晚的时候,可能有 3-4 个机位是通过有 SDI 的接口输出到切换台,由切换台选择哪路流进行推流,所以 SDI 切换台可以做视频编辑,加字幕、文字等等。HTC 的眼镜就是 PCVR 的眼镜,眼镜端在 PC 电脑上,拼接好的数据直接推到眼镜上面,在直播的时候放一个一体机在这里,用户戴上 HTC 的眼镜就可以在这里漫游一圈。



图 3


图 3 是 CUDA 的架构图,左边是核数,核数决定 CUDA 的大小,比如 960P 有 1 千多的核,1080P 是 2800 多个核。目前,CPU 的发展基本到了一定瓶颈,但是 GPU 却在每年翻倍发展。GPU 有自己的架构,有最基础的网格,每个网格都有一个块,每块下面都有限制的数,所以用 GPU 运算做大数据处理最好。但 CUDA 在并行运算时会遇到坑:


第一个坑是 CPU 与显卡的总线带宽。这是一个硬性的标准,因为 CPU-GPU 有一个物理距离,是无法改变的。比如运算一张图片,基本上有两个 FOR 循环,但是在 GPU 里面完全不同,GPU 要实现 2000 多个核同时计算,必须要防止越界,合理分配网络数据。访问一个9×9 的图片,让每个块里面有 3 个像素,取的时候线程里面有 3 个数据,都配合交叉取二维里面的数据。再比如把两张图片从 CPU 拷到 GPU 里面运算,分配的空间是两个不连续的空间,这样做对于 GPU 的运算很不友好。而且,把一张图片通过内存拷贝到显卡里的过程很耗时,必须进行优化处理,最好的优化方式就是把图片变成一个连续的内存,一次性拷过去。


第二个坑是顺序内存空间。GPU 编程很重要的一方面就是顺序的对乘,比如将一个 1G 的文本要放到 GPU 里面运算,首先要考虑的事情就是考量一下传输时间和计算时间,如果传输时间远远大于计算时间,用 GPU 运算就失去了意义。目前,传输带宽最大限额是 2.5G ,超过这个值 GPU 运算不过来。但是传输时间是毫秒级开运算的,如果忽略掉传输时间,在 1080 显卡同时计算一个矩阵相乘,GPU 至少是 CPU 百倍以上的速度。根据以往直播的经验,把 CPU 关掉、把 GPU 打开,输入进 30 帧输出时都能保证 30 帧,所以 GPU 运算性能强大。


第三个坑是并行优化。通过 GPU 进行运算有很多坑,因为它的调试很麻烦,必须调用 CUDA 里面的内核,通过 GPU 异步复制的方式进行并行优化,过程往往很复杂。

如何做到高清码率秒开?

做 4K 的时候,不仅要解决「秒开」问题,还要解决推流问题,因为首帧时间、大小等因素,直接影响最后秒开的速度。此外,编码、带宽、网络波动、4K 码流的要求等,也会影响秒开速度。


做到高清码流要做到以下几点:

必须优化 H.264 的首帧,在远程播放的时候,首次缓存更多帧下来,就可以让直播变得更流畅。


I 帧、B 帧 和 P 帧,一般的相机只有 I 帧或者是 P 帧,不会有B帧(B 帧是一个动画帧,影视设备才有,普通的手机或者是硬件基本不会有),如果推流的时候有音视频不同步,一般是视频里面插了一个 B 帧,因为多一个帧就多一个网络数据。


优化 GOP 数据,H.264 里面有一个这样的数据。

网络结点,因为推流对网络结点要求很高,做 VR 直播的时候要提前沟通好网络结点,看终端推流端到终端的延时大概要多久,然后优化网络结点。

多终端平台 VR 播放及架构


图 4



以图 4 为例,演示 VR 直播服务过程。得图网是做 VR 直播硬件服务的公司,推流端有 VR 直播一体机,经常到七牛进行回调、转录、统计、计费监控等。如果做 VR 直播、全景,可以调用得图网开发者平台的 SDK 。

在 VR 直播技术上做了以下优化措施:

实时转录


以苹果手机为例,做实时转录是因为手机上面是 HLS ,不能进行 3D 贴图。转录推流上去的时候,每 5 分钟转录成 MP4 ,移动端播放的时候延时很大。



图 5


沉浸感视角


图 5 是小行星沉浸式视角,看到这个图片会觉得有视觉冲击力,因为此时视场角脱离地球站在比较远的地方。VR 的原理就是演进和基变,所谓演进就是用一个凸镜经过光线的反射产生不均匀的同心圆,所谓基变就是把理论上光线原本应该产生的位置找出来。做法就是靠棋盘格通过拍照,找出原本的位置,然后进行数据拟合,然后把基变弯曲的曲线拉直。


跨平台 VR 漫游配置


因为 VR 漫游是纯视觉的东西,语言很难表述清楚。这是(https://github.com/suiqirui1987/DetuFlashVr)一个 flash 漫游系统,里面有 VR 漫游的做法,供大家参考。


「七牛架构师实践日」——这里只谈架构

 

七牛架构师实践日是由七牛云发起的线下技术沙龙活动,联合业内资深技术大牛以及各大巨头公司和创业品牌的优秀架构师,致力于为业内开发者、架构师和决策者提供最前沿、最有深度的技术交流平台,帮助大家知悉技术动态,学习经验成果。

 

七牛架构师实践日第十二期【泛娱乐+直播 技术最佳实践】将于 9 月 3 日与大家在 厦门 见面,目前活动正在火热报名中,点击下方「阅读原文」了解更多信息,期待你的参与。

 
七牛云 更多文章 漫画图说:直播在电商中的功能详解 《视频直播技术详解》系列之二:采集 体育赛事直播系统的实践之路 | 架构师实践日 回顾里约奥运期间,App 的花式营销大法 想刷爆朋友圈必须要知道的秘密
猜您喜欢 说书解书:与时俱进的《技术管理之巅》——作者专访 互联网自研云平台各层核心技术的选型与演进 SLAM刚刚开始的未来 看完这篇文章,我再也不敢说熟练使用Word! 设计师的修与炼––如何打造设计师的知识体系(下部)