声明:本文来自「七牛云主办的架构师实践日——泛娱乐+直播技术最佳实践」的演讲内容整理。PPT、速记和现场演讲视频等参见“七牛架构师实践日”官网。
嘉宾:孙其瑞,得图网络CTO。
责编:钱曙光,关注架构和算法领域,寻求报道或者投稿请发邮件qianshg@csdn.net,另有「CSDN 高级架构师群」,内有诸多知名互联网公司的大牛架构师,欢迎架构师加微信qshuguang2008申请入群,备注姓名+公司+职位。
与传统的手机直播推流不同的是,VR直播推流往往存在多个采集端,且推流数据的码率远远高于传统的手机直播,这给VR直播的技术实现带来了一系列挑战。对此,孙其瑞结合多年VR行业从业经验,主要分享了VR实时推流的架构与实践。以下为正文:
VR实时推流的架构与实践
图1是VR直播流程。与传统的手机直播推流不同的是,VR推流可能存在多个采集端,通常手机推流数据最多达到 1024P或者1080P,但在VR领域4K才刚刚起步。因为VR的展示跟普通的展示不一样,它是非平面、360度的,所以会多一个拼接和展示环节。拼接环节会用显卡加速到得图,然后分发到电脑、手机等各个终端,再做展示。这是VR直播与传统的直播相比最主要的区别。
在VR实时视频拼接中,最大的难点是速度而不是算法,速度决定了算法的优劣。视频拼接的算法一般会在显卡上完成(显卡编程,指的是GPU编程,与显卡的思维不一样)。除了实时拼接上的难点,超4K直播的推流控制也是VR直播中的一大难点。
总结起来,在这个过程中主要遇到如下挑战:
GPU快速处理优化;
来自网络的波动。4K直播对网络要求很高,网络波动时做4K直播,无法根据网络进行优化;
音视频同步。VR直播时,视频和音频不一样,视频要把6路、8路或者是12路进行实时拼接,再加音频口进行混合推流,这时会出现不对等现象。
如何做到实时拼接?
4路及以上的1920x1080/30fps实时处理。一般来说要达到1920×1080、30fps,会用3.0 HDMI接口;
CUDA 并发处理运算。CUDA 是专门针对显卡进行优化的;
硬编解码。做 4K 的时候经常会遇到硬编码,也是显卡编码;
多种输出格式,包括 SDI 切换台、RTMP 流、HTC 眼镜等。SDI 切换台应用比较广泛,比如春晚的时候,可能有 3-4 个机位是通过有 SDI 的接口输出到切换台,由切换台选择哪路流进行推流,所以 SDI 切换台可以做视频编辑,加字幕、文字等等。HTC 的眼镜就是 PCVR 的眼镜,眼镜端在 PC 电脑上,拼接好的数据直接推到眼镜上面,在直播的时候放一个一体机在这里,用户戴上 HTC 的眼镜就可以在这里漫游一圈。
图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为例,演示VR直播服务过程。得图网是做VR直播硬件服务的公司,推流端有VR直播一体机,经常到七牛进行回调、转录、统计、计费监控等。如果做VR直播、全景,可以调用得图网开发者平台的SDK。
在VR直播技术上做了以下优化措施:
- 实时转录。以苹果手机为例,做实时转录是因为手机上面是HLS ,不能进行3D贴图。转录推流上去的时候,每5分钟转录成MP4,移动端播放的时候延时很大。
沉浸感视角。图5是小行星沉浸式视角,看到这个图片会觉得有视觉冲击力,因为此时视场角脱离地球站在比较远的地方。VR的原理就是演进和基变,所谓演进就是用一个凸镜经过光线的反射产生不均匀的同心圆,所谓基变就是把理论上光线原本应该产生的位置找出来。做法就是靠棋盘格通过拍照,找出原本的位置,然后进行数据拟合,然后把基变弯曲的曲线拉直。
跨平台VR漫游配置。因为VR漫游是纯视觉的东西,语言很难表述清楚。这是一个flash漫游系统,里面有VR漫游的做法,供大家参考。
编辑推荐:架构技术实践系列文章(部分):
- 孙其瑞:VR应用在直播领域上的实践与探索
- 刘丁:bilibili高并发实时弹幕系统的实战之路
- 秦鹏:从应用到平台,云服务架构的演进过程
- 郭炜:从0到N建立高性价比的大数据平台
- 李智慧:宅米网技术变迁——初创互联网公司的技术发展之路
- 陶文质:分布式系统设计的求生之路
- 魏晓军:React Native实践之携程Moles框架
- 学霸君姜波:耳目一新的在线答疑服务背后的核心技术
- 爱乐奇麦凯臻:在线教育的内容研发和技术的迭代创新
- 长虹李玮:老牌消费电子企业如何拥抱Docker
- 徐汉彬:日请求过亿的Web系统PHP7升级实践
- 窦威:AcFun的视频架构演化实践
- 傅鸿城:QQ亿级日活跃业务后台核心技术揭秘
- 宁峰峰:尖峰日96万订单,59校园狂欢节技术架构剖析
- 梁阳鹤:每秒处理10万订单乐视集团支付架构
- 沈辉煌:亿级日PV的魅族云同步的核心协议与架构实践
- 李任:携程Docker最佳实践
- 王海军:游戏研发与运营环境Docker化
- 史海峰:当当网高可用架构之道
- 黄哲铿:应对电商大促峰值的九个方法
- 1号店交易系统架构如何向「高并发高可用」演进
- 京东闫国旗:从C10K到C10M高性能网络的探索与实践
- 李林锋:服务化架构的演进与实践
- 1号店架构师王富平:一号店用户画像系统实践
- 唯品会官华:实现电商平台从业务到架构的治理体系
- 沈剑:58同城数据库架构最佳实践
- 荔枝FM架构师刘耀华:异地多活IDC机房架构
- UPYUN的云CDN技术架构演进之路
- 初页CTO丁乐:分布式以后还能敏捷吗?
- 陈科:河狸家运维系统监控系统的实现方案
- 途牛谭俊青:多数据中心状态同步&两地三中心的理论
- 云运维的启示与架构设计
- 魅族多机房部署方案
- 艺龙十万级服务器监控系统开发的架构和心得
- 京东商品详情页应对“双11”大流量的技术实践
- 架构师于小波:魅族实时消息推送架构