本文来自Google的开发专家Dan Jenkins,他喜欢将最新的Web API与RTC应用程序混合在一起。他还在Nimble Ape经营自己的咨询和开发公司。本文中,他给出了一个代码实现——通过使用WebVR将FreeSWITCH Verto WebRTC视频会议转换为虚拟现实会议的。LiveVideoStack对原文进行了摘译。

文 / Dan Jenkins

译 / 元宝

审校 / Ant

原文 :

https://webrtchacks.com/webrtc-meets-webvr/

WebRTC不是Web平台上唯一流行的媒体API。几年前推出了Web虚拟现实(WebVR)规范,以便在Web浏览器中为虚拟现实设备提供支持。此后,它已移植到较新的WebXR设备API规范了。

今年早些时候在ClueCon,Dan Jenkins在演讲中表示,使用FreeSWITCH将WebRTC视频会议流添加到虚拟现实环境中相对容易。FreeSWITCH是比较流行的开源电话平台之一,已使用WebRTC好几年了。

几周前,我在ClueCon开发者大会上发表了一篇关于WebRTC和WebVR的演讲——Web开发者可以使用的新媒体。将虚拟现实内容带入你的浏览器和手机对于具有新人口统计数据的应用程序具有巨大潜力。在过去的两三年里,虚拟现实已经绝对可以负担得起,并且可以广泛使用,最近的手机使用Google的Cardboard,而现在的“白日梦”也适用于一些高端手机。还有Oculus Go,它根本不需要移动设备。我想探索如何将这种新的经济实惠的媒体用于WebRTC媒体应用。

老实说,当我将论文提交给征集文件中心时,我对WebVR一无所知,但我知道在看到其他演示能够实现的结果后,我可能会得到一些有用的东西。我似乎有时间去做一些新的、令人兴奋的事情,唯一的办法就是直接在Call For Papers去做一个疯狂的演讲。

注意:从技术上讲,它现在是“WebXR”,但我会坚持使用这篇文章中更常见的“VR”。

A-Frame框架

有很多方法可以开始使用WebVR,但我采用的方法是使用一个名为A-Frame的框架,它允许你编写一些HTML,并引入一个JavaScript库并立即开始构建VR体验。虽然演示并没有像我希望的那样完美,但它确实证明了你可以用非常少的代码构建出色的虚拟现实体验。

如果你对Web组件感到很满意,你就会马上意识到A-Frame的作用。现在,你可能会问为什么我沿着A-Frame路线走而不是直接使用WebGL以及使用WebVR polyfill和Three.js创建WebGL对象或许多其他框架中的一个。简单地说,我喜欢尽可能的少编写代码,而A-Frame框架似乎是为我量身定做的。

如果你不喜欢A-Frame框架,可在webvr.info上查看其他可用选项,如React 360。

使用WebRTC和Freeswitch构建WebVR

今天使用A-Frame框架可以获得一些WebRTC VR体验。在Mozilla的团队做了一个用户可以彼此看到表示为VR场景的点,并能听到彼此的声音。他们能够使用WebRTC数据通道和WebRTC音频来实现这一点,但我真的没有找到任何使用WebRTC视频的方法,因此开始了如何在3D环境中使用实时视频的挑战。

我演讲的演示基础是开源的FreeSWITCH Verto Communicator。Verto使用WebRTC,我已经知道如何使用Verto客户端库与FreeSWITCH中的Verto模块通信,因此已经打过了一半的战斗。Verto客户端库是信令部分——在将SIP PBX连接到WebRTC端点的更常见体验中,通过WebSocket替换SIP。

HTML

看一下我最终添加到Verto Communicator的A-Frame代码。总共有8行HTML:

<a-scene>
  <a-assets>
  </a-assets>
  <a-entity environment="preset: forest" class="video-holder">
    <a-entity camera="active: true" look-controls wasd-controls position="0 0 0" data-aframe-default-camera></a-entity>
    <a-entity daydream-controls></a-entity>
    <a-entity>
</a-scene>

首先,我们有一个“a-scene”元素,它创建了一个场景,其中包含了与你的VR体验相关的所有内容。空的“a-assets”标签是我们稍后放置WebRTC视频标签的地方。

接下来的“a-entity”线是一个“简单”的让用户沉浸其中的体验。它是一个具有森林预设环境的a-frame框架实体 - 基本上可以引导我们的整个体验。

剩下的实体用于我们的相机和我们的daydream控制。查看带有a-frame框架的可用组件以及可以使用的基本体来创建3D形状和对象。

这一切只是把我们的场景组合在一起。接下来,我们将使用一些JavaScript设置我们的控制逻辑代码。

JavaScript

Verto 通信器是一个基于角度的应用程序,因此可以从主应用程序空间添加和删除元素。我们需要一些逻辑来将Verto链接到我们的A-Frame设置。大多数逻辑少于40行JavaScript:

function link(scope, element, attrs) {

var newVideo = document.createElement('a-video');
  newVideo.setAttribute('height', '9');
  newVideo.setAttribute('width', '16');
  newVideo.setAttribute('position', '0 5 -15');
  console.log('ATTACH NOW');
  var newParent = document.getElementsByClassName('video-holder');
  newParent[0].appendChild(newVideo);

window.attachNow = function(stream) {
    var video = document.createElement('video');

var assets = document.querySelector('a-assets');

assets.addEventListener('loadeddata', () => {
      console.log('loaded asset data');
    })

video.setAttribute('id', 'newStream');
    video.setAttribute('autoplay', true);
    video.setAttribute('src', '');
    assets.appendChild(video);

video.addEventListener('loadeddata', () => {
      video.play();

// Pointing this aframe entity to that video as its source
      newVideo.setAttribute('src', `#newStream`);
    });

video.srcObject = stream;
  }

当你前往Verto Communicator应用程序中的会议页面时,将会加载上面的“link”函数。

修改Verto

你可以看到,当链接被调用时,它将创建一个新的“a-video”元素,并为其提供宽度和高度的一些属性,以及将其放置在我们的3D环境中的位置。

这个“attachNow”函数才是真正神奇的地方——当一个会话启动时,我修改了Verto库,在名为attachNow的窗口上调用一个函数。默认情况下,Verto库将初始化jQuery样式标记,并为你添加/删除该标记的媒体。这对我来说是不可能的——我需要获得一个流并且能够自己进行操作,这样我就可以将视频标签添加到我上面显示的所需空资产组件中。这让A-Frame可以发挥其神奇作用——从资产中获取数据并将其加载到在3D环境中显示的“a-video”标签内的画布上。

我有另外一个函数移动到了vertoServices.js中:

function updateVideoRes() {
    data.conf.modCommand('vid-res', (unmutedMembers * 1280) + 'x720');
    attachNow();
    document.getElementsByTagName('a-video')[0].setAttribute('width', unmutedMembers*16);
  }

“updateVideoRes”旨在改变FreeSWITCH的Verto会议的输出分辨率。随着用户加入会议,我们希望在3D环境中创建一个越来越长的视频显示。实质上,每次我们获得新成员时,我们都会使输出变得越来越长,这样用户就会并排出现。

可视化

这就是最终的结果,在这个3D环境中,Simon Woodhead和我一起在一个“电影放映”中创建了一个虚拟现实环境。

Verto WebVR会话的2D视图

关于WebVR的真正伟大之处在于,你无需使用VR耳机即可完成所有工作,你可以单击纸板按钮,你的虚拟现实体验将变成全屏显示,就像你戴着耳机一样。你可以在YouTube上观看ClueCon上的视频(https://youtu.be/FxIlzFs4A7o)

我们学到了什么?

演示的一半成功了,另一半没有。最大的学习是,尽管这可能是观看视频会议的绝妙方式,但将虚拟现实观众包括在视频会议中是不可行的。 当他们戴着耳机看着它的时候。也许这就是微软的HoloLens通过混合现实使事情变得更好的地方。

所有代码

代码可以在我的bitbucket(https://bitbucket.org/nimbleape/freeswitch/branches/compare/webvr..#diff)找到,直到我们弄清楚如何解决FreeSWITCH的git历史记录损坏的问题(https://freeswitch.org/jira/browse/FS-11338),这意味着您无法在其他任何地方托管代码(例如我首选的git store,github)——让FreeSWITCH团队知道你是否遇到与该链接相同的问题。

使用WebRTC和WebVR进行VR视频通话相关推荐

  1. html5 视频语音对讲,一种基于WebRTC的多人语音视频通话方法及系统与流程

    本发明涉及视频通话领域,特别涉及一种基于WebRTC的多人语音视频通话方法及系统. 背景技术: 随着互联网技术和通信技术的快速发展,人们的交流方式与交流内容得到了极大的丰富和发展.在节奏越来越快的信息 ...

  2. WebRTC现状以及多人视频通话分析

    1.WebRTC 概述 WebRTC(网页实时通信技术)是一系列为了建立端到端文本或者随机数据的规范,标准,API和概念的统称.这些对等端通常是由两个浏览器组成,但是WebRTC也可以被用于在客户端和 ...

  3. html5是否支持webvr,安卓版Chrome浏览器正式支持WebVR,VR看片更加方便!

    你现在的位置: 首页 > VR > VR新闻 之前POPPUR为大家介绍过SVRF Tabs应用,各位在下载该插件之后,在Chrome 浏览器上建立新标签页时就可以欣赏全景图片,不过这和真 ...

  4. webRTC——浏览器里的音视频通话

    背景 webRTC是Google在2010年收购GIP公司之后获得的一项技术.如下图所示,它提供了音视频的采集.处理(降噪,回声消除等).编解码.传输等技术. webRTC的目标是实现无需安装任何插件 ...

  5. webRTC——浏览器里的音视频通话 1

    背景 webRTC是Google在2010年收购GIP公司之后获得的一项技术.如下图所示,它提供了音视频的采集.处理(降噪,回声消除等).编解码.传输等技术. webRTC的目标是实现无需安装任何插件 ...

  6. 使用WebRTC实现语音通话,视频通话

    WebRTC介绍 WebRTC,名称源自网页实时通信(Web Real-Time Communication)的缩写,是一个支持网页浏览器进行实时语音对话或视频对话的技术,谷歌2011年5月进行开源. ...

  7. vue + node + webrtc 实现多人音视频通话

    最近在搞一个内网音视频通话的功能,最终确定前端要用webrtc去实现,网上关于webrtc的文章不是很多,想找一个demo也很难,最终在gitee上找到一个大佬写的,很符合目前需求,前端js后台是no ...

  8. DeepFocus,基于AI实现更逼真的VR图像

    DeepFocus是一种基于AI的渲染系统,用于在VR中渲染自然逼真的人眼聚焦效果.本文来自Facebook工程博客,LiveVideoStack进行了翻译.感谢阿里巴巴高级算法专家盛骁杰提供的技术审 ...

  9. Everyday-FE-Articles 8~11月前端文章日推 [持续更新]

    Everyday-FE-Articles 由来自@阿里马跃的每日文章推荐,于是顺手整理,以便学习... -- By Ale-cc /* 注:序号不准确 */ 八月份 8月7日 星期二,农历六月廿六 S ...

最新文章

  1. 刻意练习:Python基础 -- Task12. 模块
  2. Python脚本BUG引发学界震动,影响有多大?
  3. 记录爬取2470条数据
  4. 15篇最新AI论文推荐新鲜出炉!真的很skr了~(附链接)
  5. 92.芯片组 93.北桥 94.南桥
  6. Serverless 解惑——函数计算如何访问 PostgreSQL 数据库
  7. nginx 配置expires
  8. 比IETEST更好用的浏览器兼容性测试软件[绿色]
  9. 【Tensorflow】ValueError: Only call `sigmoid_cross_entropy_with_logits` with named arguments
  10. sap运维要做哪些工作_患上腰椎间盘突出,适合做哪些工作?不适合做哪些工作?...
  11. ASP.NET MVC3 学习心得------路由机制
  12. delphi 发送网络消息_Actor 消息的可靠交付(Akka Typed)
  13. 【ACM2020】少样本学习综述
  14. java伪随机数(菜鸟教程)
  15. 深入浅出python系列(一):基本数据类型
  16. python小白的word转excel
  17. ffmpeg ts与mp4互相转换
  18. 属性管理器没有Microsoft.Cpp.x64.user的解决办法
  19. SpringBoot整合银联支付
  20. 软件开发人员的内功修炼之道

热门文章

  1. outlook vba开发要点
  2. 并发编程之多进程3 (生产者与消费者模型) 回调函数
  3. Sequelize 中文文档 v4 - Querying - 查询
  4. 关于迭代測试的一些思考
  5. 深入分析 Java 方法反射的实现原理
  6. linux双机ssh互信方法总结
  7. Linux下C编程实战
  8. 破解sina新浪邮箱密码
  9. csv文件导入导出到mysql
  10. 光纤通道如何过渡到SAN