使用WebRTC和WebVR进行VR视频通话
本文来自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团队知道你是否遇到与该链接相同的问题。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
音视频技术开发周刊 65期
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/vn9PLgZvnPs1522s82g/article/details/82392657 『音视频技术开发周刊』由LiveVideoStack团队出品,专注在音视频技术领域,纵览相关技术领域的干货和新闻投稿,每周一期。点击『阅读原文』,浏览第65期内容,祝您阅读愉快。 架构 51Talk音视频技术实践和独特挑战 本文来自51Talk技术总监陈靖在LiveVideoStackCon 2018热身分享,并由LiveVideoStack整理而成。陈靖回顾了51Talk音视频技术的演进路线,从最早的QQ、Skype到接入第三方SDK,最后实现大部分功能自研,每个阶段都是根据业务需求、研发力量、资金投入等各种条件下的最优选择。未来,51Talk还会继续投入自研,完善功能。 李青源:高清体验和带宽节省,瞄准方向深耕 在LiveVideoStackCon 2018前夕,金山云资深产品专家李青源接受了LiveVideoStack的采访。他聊到了金山云在“视频+AI”和“编解码”方向的探索,致力于为终端观众...
- 下一篇
并发容器与框架——Fork/Join框架
1. Fork/Join框架概念 Fork/Join框架是Java提供的一个用于并行执行任务的框架,它会将一个大任务分成多个小任务,并且将每个小任务的最终结果汇总得到大任务结果的框架。比如对1+2+3+····+100求和,可以分成十个子任务分别对10个数求和,最后再汇总这十个子任务的结果。 2.工作窃取算法 工作窃取算法是指某个线程从其他任务队列里窃取任务来执行。 假如我们可以将一个总任务分割成多个互不相干的子任务,为了减少线程的竞争,我们会将这些子任务放在不同的队列中,并为每个队列都建造一个线程执行该队列的任务,线程和队列一一对应。但是有些线程可能会很早的执行完自己队列中的所有任务,而其他线程还会处理自己拥有的队列中的任务,此时已处理完任务的线程与其等待其他线程执行任务,不如帮助其他线程一起执行剩余任务。这时他们会从其他线程的队列里窃取一个线程执行任务,所以为了避免因为工作窃取引起的两个线程之间的竞争,通常任务队列会使用双端队列。任务队列线程从头部取任务,窃取线程从尾部取任务。 优点是充分利用线程进行并行运算,并减少了竞争,缺点就是还是存在竞争情况,比如队列中任务数为1时,...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7设置SWAP分区,小内存服务器的救世主
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- 设置Eclipse缩进为4个空格,增强代码规范
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2全家桶,快速入门学习开发网站教程
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- CentOS8安装Docker,最新的服务器搭配容器使用
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题