VR应用在直播领域上的实践与探索

2023-05-16

声明:本文来自「七牛云主办的架构师实践日——泛娱乐+直播技术最佳实践」的演讲内容整理。PPT、速记和现场演讲视频等参见“七牛架构师实践日”官网。
嘉宾:孙其瑞,得图网络CTO。
责编:钱曙光,关注架构和算法领域,寻求报道或者投稿请发邮件qianshg@csdn.net,另有「CSDN 高级架构师群」,内有诸多知名互联网公司的大牛架构师,欢迎架构师加微信qshuguang2008申请入群,备注姓名+公司+职位。

与传统的手机直播推流不同的是,VR直播推流往往存在多个采集端,且推流数据的码率远远高于传统的手机直播,这给VR直播的技术实现带来了一系列挑战。对此,孙其瑞结合多年VR行业从业经验,主要分享了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码流的要求等,也会影响秒开速度。

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

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

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

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

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

多终端平台VR播放及架构

图片描述

图 4

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

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

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

图片描述

图 5

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

  2. 跨平台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”大流量的技术实践
  • 架构师于小波:魅族实时消息推送架构
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

VR应用在直播领域上的实践与探索 的相关文章

  • ROS学习1

    1 安装ros 我这里使用的是ros melodic这个版本 xff0c 具体安装可以参考其它教程 管理环境 printenv grep ROS 得到 ROS DISTRO 61 melodic ROS ETC DIR 61 opt ros
  • ubuntu18.04使用apt安装python3.7

    sudo apt update sudo apt install software properties common sudo add apt repository ppa deadsnakes ppa sudo apt install
  • c++读取自定义点云pcd文件

    之前查读取pcd的文件 xff0c 大多数是用python的open3d来进行读取 xff0c 但是这样读取到的信息 xff0c 好像只能够得到 pcd points 和pcd colors 但是如果想要把pcd中的信息都拿到呢 xff0c
  • lio-sam中点云地图保存

    在 src save map srv 中有如下的定义 float32 resolution string destination bool success 注意 下面指的是feedback xff0c 接下来看save map这个服务是如何
  • IoU-aware Single-stage Object Detector for Accurate Localization

    Motivation 从这张图里面可以很好地看出来作者的出发点 xff0c 即在目标检测里面 xff0c 分类的分数其实并不能够准确地反应框是否准确 像上面 xff0c 都是分类分数高 xff0c 而iou低的case 而真正iou高的框
  • SECOND: Sparsely Embedded Convolutional Detection

    contributions 应用sparse convolution 提升了训练以及inference的速度 提出一个novel 的angle loss 来回归yaw角 介绍了gt sampling的augmentation的方式 spar
  • Mac外接键盘ikbc win键无法使用问题

    ikbc的型号 是c87 青轴的 之前win键是可以用的 xff0c 今天发现不能用了 xff0c 查了一下 xff0c 原来是无意中按错被锁住了 按右下边的Fn 43 右上 PrtSc 即可解锁 又可以愉快地使用win键敲代码了
  • ros学习(七):sensor_msgs 消息类型

    一 sensor msgs Imu sensor msgs Imu Documentation http docs ros org en api sensor msgs html msg Imu html c 43 43 使用时头文件为 x
  • np.random.choice的用法

    import numpy as np 参数意思分别 是从a 中以概率P xff0c 随机选择3个 p没有指定的时候相当于是一致的分布 a1 61 np random choice a 61 5 size 61 3 replace 61 Fa
  • np.clip()的用法

    一时间忘了 xff0c 就又看了一下API 是这样说的 numpy clip a a min a max out 61 None source Clip limit the values in an array Given an inter
  • np.roll的用法

    coding UTF 8 import numpy as np np roll a shift axis 61 None 意思是将a xff0c 沿着axis的方向 xff0c 滚动shift长度 example1 a 61 np aran
  • 为什么vmware中的ctrl+alt+F1~F7不能用?

    这个总是确实困挠了我好久 xff0c 也花了我大把大把的时间去弄 xff0c 终于今天搞定了 xff0c 但是其实就2分钟就能搞定的事情 所以在此作总结 希望能帮助其他人 我的目的是想用Mac装上Vmware xff0c 然后在里面下ten
  • Squeeze-and-Excitation Networks 的理解

    SE Block 主要是考虑到了不同通道之间所占的重要性可能不一样 xff0c 而以前的网络中并没有考虑到这一点 xff0c 而是把所有通道的重要性当成一样来处理的 不同的通道的重要性是通过学到的一组权值来scale的 xff0c 相当于经
  • Gitee同步GitHub仓库如何操作

    最近 xff0c 许多开发者在进行私有仓库同步时 xff0c 会发现无法在 Gitee 通过同步功能拉取 GitHub 上的代码 xff0c 产生该问题的原因是 GitHub 从 2021 年 8 月 14 日后 xff0c 使用 Git
  • AUTOSAR ComM模块介绍

    AUTOSAR ComM模块介绍 Autosar ComM概述 Autosar ComM 全称是 Autosar Communication Manager 顾名思义就是用来管理通讯的 ComM 模块位于 BSW 中 Systme Serv
  • C语言中__FILE__ __LINE__ #line的用法

    C语言中 FILE LINE line的用法 C语言中 FILE 用于指示本行语句所在源文件的文件名 例如该行语句位于main c中 xff0c 则 FILE 表示main c C语言中 LINE 用于指示本行语句位于源文件中的位置即行数
  • 【新手向】make工具的使用

    make工具 在了解make工具前我们回顾下gcc编译步骤 1 xff09 预处理 处理与 号相关的代码 gcc E xxx c o xxx i 2 xff09 编译 检查语法错误 xff1b 如果语法有误则报错 xff0c 如果语法没错则
  • [python] python调用C++ 程序

    Python调用C C 43 43 程序的方法 最近写BUG的时候遇到python计算很慢的情况 xff0c 于是调研了一波在python中嵌入C 43 43 程序的方法 xff0c 记录一下 xff0c 便于查询 一般来说在python调
  • 深度学习(三):yolov5环境配置及使用

    目录 0 前言 1 环境配置 1 1 python环境 1 2 官方github的样例 1 2 1 打印检测结果 1 2 2 展示检测结果 2 运用detect py进行检测 2 1 网络摄像头 2 2 将检测过程可视化 3 运用train
  • sensor_data参数校验

    新的 xff1a Akamai sensor data zwl haley的博客 CSDN博客 只说下思路吧 xff0c 毕竟把加密代码公开对别网站不好 如有权益问题可以发私信联系我删除 xff0c 或q 1847858794 如图 xff

随机推荐

  • C++ muduo网络库知识分享01 - Linux平台下muduo网络库源码编译安装

    Muduo is a multithreaded C 43 43 network library based on the reactor pattern muduo库的介绍就是 xff1a 一个基于reactor反应堆模型的多线程C 43
  • FCT测试

    1 总论 2 启动过程 3 各模块实现 1 总论 FCT 作为 Android 的一个外来测试程序 xff0c 位于源码的 external 文件夹内 xff0c 其目的是作为产品在 PCBA 装配生产线中的一个制程 xff0c 对外围硬件
  • ARM上电启动及Uboot代码分析

    注意 xff1a 由于文档是去年写的 xff0c 内有多个图片 xff0c 上传图片很麻烦 xff08 需要截图另存插入等等 xff09 xff0c 我把文章的PDF版本上传到了CSDN下载资源中 为了给自己赚点积分 xff0c 所以标价2
  • 【解决】缺少libstdc++.so.6库的原因及解决办法

    问题原因 xff1a 系统是64bit xff0c 该库是32bit的 xff0c 在64bit系统上安装32bit库 解决办法 xff1a 1 查看哪个安装包包含该库 xff1a yum provides libstdc 43 43 so
  • 仿真器和模拟器的区别

    仿真器 xff08 emulator xff09 和模拟器 xff08 simulator xff09 是比较容易混淆的概念 xff0c 这两个概念不仅针对计算机体系结构 xff0c 在很多方面都有所应用 xff0c 例如航空模拟器 街机仿
  • Flush-Cache/Page-Lock/Flush-TLB说明

    Flush Cache Page Lock Flush TLB说明 理论上顺序 xff1a 获得页面锁 xff0c 保证后续flush操作完成之前不允许继续读写Flush cacheFlush tlb 以下用numa migrate pag
  • 内核动态补丁(kpatch)及kpatch pushsection popsection previous的解释

    内核动态补丁 xff08 katch xff09 解释 本文阅读体验不好 xff0c 因此做了pdf版本 xff0c 点击下载 xff0c 如果你没有分数 xff0c 可以直接留言找我要pdf版本 内核可以在运行时动态执行补丁中的代码 xf
  • Shell编程:字符串与数值之间的转换与计算

    shell编程往往需要对字符串进行操作 xff0c 有时需要将字符串转为数值 xff0c 并做加减运算 以下介绍将字符串转为数值并进行计算的方法 temp1 61 400d7c echo 16 temp1 43 4 xff08 打印默认是十
  • linux内核代码预处理后便于阅读

    inux 内核庞大而复杂 内核代码阅读的时候 xff0c 有没有遇到因为宏定义或者inline层次太深而不知道到底代码是什么样子 代码预处理可以解决这个难题 平台 xff1a linux 3 4 5 ARM xff0c PC linux上类
  • 深度学习(六):pointnet.pytorch环境配置与学习

    目录 0 前言 0 1 shapenet数据集 1 配置环境 1 1 配置Python环境与安装pytorch 1 2 安装pointnet及其他包与下载数据 2 默认训练 2 1 分类训练train classification 2 1
  • sed在行首(行尾)添加字符串;在某行后添加多行字符串

    sed在行首添加字符串 xff1b sed s xxx 39 filename gt output xff1a 符号代表行首 sed在行尾添加字符串 xff1b sed s string 39 filename gt output xff1
  • 【解决】xterm Xt error: Can't open display: xterm: DISPLAY is not set

    当你运行xterm出现错误如下 xff1a xterm Xt error Can 39 t open display xterm DISPLAY is not set 我的系统centos6 2 解决办法 xff1a 1 首先确定你安装了x
  • 【解决】yum 安装 出错 Error: Protected multilib versions:

    我安装zlib出错 xff1a yum install zlib 1 2 3 29 el6 i686 Error Protected multilib versions zlib 1 2 3 29 el6 i686 61 zlib 1 2
  • 贴一下我的 vimrc 以及 vim 效果

    贴一下我的vimrc 看起来真的很养眼 xff0c 呵呵 这几天一直忙活着配置VIM xff0c 这个编辑器太迷人了 虽然emacs也强大 xff0c 可是仔细想想 xff0c 还是vim的效率高一些 原因如下 xff1a emacs通过
  • vim语法高亮——使自定义类型也能高亮的简单办法

    说明 xff1a 判断是否类型的简单办法 xff0c 就是简单的观察 xff1a 如果该标志符后面有空格 xff0c 空格后又是一个标志符的话 xff0c 在 xff23 xff0f xff23 xff0b xff0b 语言中 xff0c
  • 原创:纠正国人对Linux的误解和错误认识

    错误印象和认识罗列如下 xff0c 一一解释 xff1a 1 linux下的软件太少 回答 xff1a linux 下的软件一点也不少 windows还在娘肚子里的时候 xff0c Unix已经如日中天了 要知道微软公司开发的第一个操作系统
  • 原创:自己写的端口数据转发工具pf (port forwarding)

    看了 子清行 朋友博客里的一篇文章 xff0c 讲述了一个叫 DuplexPipe 的小工具的实现 最开始没怎么懂意思 xff0c 看了他公开的源代码 xff0c 是用java写的 xff0c 一个jar包 可惜我不太会java 因此没法看
  • 又一次被linux的工具震惊了

    前一篇博客还写了自己写的端口转发工具 xff0c 今天偶然在网上看到讲命名管道和netcat配合的用法 xff0c 被彻底雷倒了 原来以为netcat做不到 xff0c 原来是自己想不到 xff0c 而不是netcat做不到 方法如下 xf
  • Ubuntu桌面旋转xrandr

    项目实行过程中 xff0c 设备安装为竖屏模式 xff0c 分辨率由19201080变为10801920 xff1b 最简单实现 xff0c 将桌面系统显示旋转 xff1a xff08 终端命令 xff09 xrandr o left 向左
  • VR应用在直播领域上的实践与探索

    声明 xff1a 本文来自 七牛云主办的架构师实践日 泛娱乐 43 直播技术最佳实践 的演讲内容整理 PPT 速记和现场演讲视频等参见 七牛架构师实践日 官网 嘉宾 xff1a 孙其瑞 xff0c 得图网络CTO 责编 xff1a 钱曙光