派对巴士内:构建一个带有多个实时视频流和交互式图形的 Web 应用程序

Gearcloud Labs 正在探索使用开放技术来构建新型的共享视频体验。派对巴士是一个演示应用程序,它将多个实时视频流与交互式图形和同步音频混合在一起。我们使用 node.js、WebSockets、WebRTC、WebGL 和 Web Audio 的组合构建了它。本文分享了我们在构建过程中的一些经验。

用户体验

首先,体验一下派对巴士应用程序,看看它能做什么。你需要 Firefox 或 Chrome 以及一个性能不错的 GPU,但如果没有,你可以观看 YouTube 上的示例视频 来了解这个应用程序。

由于该应用程序使用了 WebRTC getUserMedia(),你需要允许浏览器使用你的摄像头。启动后,你会注意到你的视频流被安装在 3D 巴士上的座位上(以及来自任何其他同时使用者的实时流)。在大多数场景中,你可以使用鼠标左键(改变摄像头角度)、滚轮(放大/缩小)和鼠标右键(改变摄像头位置)来操控 3D 巴士。还可以尝试底部控制栏中的按钮,将特效应用到你的视频流:从改变颜色到将自己翻转过来、在座位上弹跳等等。

派对巴士如何使用 WebRTC

派对巴士使用 WebRTC 建立体验所需的点对点视频流。WebRTC 在支持浏览器中的原生视频方面做得很好,它可以穿透防火墙以启用对等连接(通过 STUN)。但使用 WebRTC 时,你还需要提供自己的信令器来协调哪些端点将参与给定的应用程序会话。

派对巴士应用程序使用我们构建的名为 Mixology 的原型平台来处理信令和支持使用动态对等拓扑结构。请注意,许多应用程序可以使用 peer.js,但我们正在使用 Mixology 来探索将大量流组合到各种不同连接图中,以实现新的可扩展方法。

例如,如果使用者加入一辆已经有其他使用者的巴士,系统会负责在新的使用者和同一辆巴士上的对等使用者之间构建必要的连接路径,然后通过 WebSocket 通知所有对等使用者,需要为新的使用者分配一个座位。

具体来说,客户端通过实例化一个 Mixology 对象来与 Mixology 信令服务器交互

var m = new Mixology(signalerURL);

然后使用它来注册信令器

m.register(['mix-in'], ['mix-out']);

这两个参数分别提供了客户端支持的特定输入流和输出流类型。通过这种方式对输入和输出进行类型化,Mixology 可以组装任意流连接图,这些连接图可能因应用程序需求而异。在派对巴士的情况下,我们只在所有对等使用者之间使用完全连接的网格。也就是说,所有客户端都使用相同的输入和输出类型注册。

信令器是作为 node.js 应用程序实现的,该应用程序维护着一个已注册对等使用者及其连接的表格。因此,信令器可以负责处理对等使用者的加入、退出和其他事件 - 通过回调函数根据需要更新其他对等使用者。对等使用者和信令器之间所有通信都在内部使用 WebSockets 实现,使用 socket.io。

例如,当注册一个新的对等使用者时,服务器会更新拓扑表格,并使用回调函数通知需要了解新连接的其他对等使用者。

m.onPeerRegistered = function(peer) { ... }

在这个函数中,被指定发送流的对等使用者会启动 WebRTC 协商代码。被指定接收流的对等使用者会启动 WebRTC 应答代码(以及提供一个 onAddStream() 回调函数,在新的输入流准备就绪时使用)。

在派对巴士的情况下,接下来由应用程序将新的视频流映射到 3D 巴士模型中的正确座位上,然后使用 three.js 应用必要的 3D 变换。类似地,如果一个使用者离开巴士,系统会负责通知其他客户端一个对等使用者已经退出,以便他们采取适当的操作来删除显示中原本是死视频流的东西。

派对巴士使用一个虚拟屏幕数组来组织巴士上的“使用者”

var vsArray = new Array(NUM_SEATS);

在使用 Mixology 注册自身后,应用程序会在新的对等视频流可用于其巴士实例时收到回调

function onAddStream(stream, peerId) {
    var i = getNextOpenSeat();
    vsArray[i] = new VScreen(stream, peerId);
}

派对巴士应用程序为当前巴士上的每个视频流创建一个虚拟屏幕对象。传入的流与虚拟屏幕构造函数中的 DOM 视频对象相关联

function VScreen(stream, id) {
    var v = document.createElement(‘video’);
    v.setAttribute(“id”, “monitor:” + id);
    v.style.visibility = “hidden”;
    v.src = window.URL.createObjectURL(stream);  // binds stream to dom video object
    v.autoplay = “true”;
    document.body.appendChild(v);
}

电影还是应用程序?

派对巴士使用 three.js 来绘制一辆双层巴士,以及“乘坐”在座位上的虚拟屏幕。动画循环大约运行两分钟,包含大约十二个导演“镜头”。在整个演示过程中,各个视频屏幕都是实时的,每个使用者都可以操控它们。镜头序列的设计是为了改变场景灯光并呈现其他视觉效果,例如使用 Stemkoski 的粒子引擎创建的巴士推进器。

派对巴士是一个 Web 应用程序,但动画被编程为使用者可以像电影一样运行它。好奇的使用者可能会尝试与它交互,并发现它在大多数场景中都可以改变 3D 视图。但是,在有移动摄像头或巴士的镜头中,我们发现有必要阻止某些摄像头平移(在 x、y、z 方向上的移动)或旋转(在 x、y、z 轴上的旋转) - 否则,鼠标会与程序“冲突”,导致画面卡顿。

但派对巴士的大部分乐趣仅仅是对着摄像头卖萌,将视觉效果应用到自己的流中,以及寻找其他实时使用者。

更多信息

有关派对巴士应用程序的更多信息,或想了解 Mixology 平台的开发动态,请访问 www.gearcloudlabs.com

关于 Bill Stinson

Gearcloud Labs 的联合创始人。此前,Bill 在 Verizon、GTE Labs 和 Bell Labs 领导了 Web/移动应用程序和关键运营系统的开发。他对移动技术、计算机视觉、增强现实和机器人技术感兴趣。

更多由 Bill Stinson 撰写的文章...

关于 Rob Chang

Rob 是 Gearcloud Labs 的联合创始人。在创办 Gearcloud 之前,Rob 曾在美国威瑞森、诺基亚和多家移动初创公司工作。

更多由 Rob Chang 撰写的文章...

关于 Robert Nyman [名誉编辑]

Mozilla Hacks 的技术布道者和编辑。发表演讲和博客文章,内容涉及 HTML5、JavaScript 和开放网络。Robert 是 HTML5 和开放网络的坚定支持者,自 1999 年以来一直致力于 Web 前端开发 - 在瑞典和纽约市。他还定期在 http://robertnyman.com 上发布博客文章,喜欢旅行和结识新朋友。

更多由 Robert Nyman [名誉编辑] 撰写的文章...


6 条评论

  1. jr conlin

    我非常想看看信令服务器的一些代码和指标。它只是简单地中继连接吗?使用者是如何被划分到巴士上的?服务器可以处理多少负载?

    诸如此类的东西。

    太棒了!

    2014 年 4 月 1 日 下午 10:59

  2. Rob Chang

    信号服务器是一个 node.js 应用,它协调 WebRTC 的 offer、answer 和 ICE 消息,以在加入派对巴士的用户(对等体)之间创建完全连接的网状结构。目前,我们限制每辆巴士最多四名用户,以限制网络摄像头带宽的使用。当一辆巴士满员时,就会“创建”一辆新的巴士。黑白视频是静态视频文件,不会通过 WebRTC 流式传输。

    在服务器负载方面,它可以处理更多用户,因为它只是转发 WebRTC 连接信息。我们正在 Google Compute Engine 上运行此演示,并进行了一些快速性能测试。我们发现,高达约 300 个同时连接到 node.js(单个实例)时,没有问题。

    感谢您查看!

    -Rob

    2014 年 4 月 2 日 下午 8:00

  3. 开发研究

    非常棒的例子,展示了今天可以用开源技术构建什么。顺便问一下,我们可以看看混合服务器的源代码吗?谢谢!

    2014 年 4 月 9 日 上午 4:19

    1. Bill Stinson

      感谢您的反馈。我们还没有开源服务器端代码,但我们希望将来分享更多内容 - 请继续关注!

      2014 年 4 月 11 日 下午 12:05

  4. 糟糕的浏览器

    顺便说一句,运行演示后,火狐变得非常卡顿,几秒钟后,每个操作都会出现暂停,包括在这个文本框中输入、滚动、打开和浏览书签,所有操作都是这样。所以如果这是你为移动手机操作系统打下的基础,那么祝你好运!

    2014 年 4 月 9 日 上午 6:47

    1. Bill Stinson

      这个项目不是移动手机操作系统的基础。这是一个探索实验,旨在研究使用 WebRTC 在支持任意视频连接图的 API 下可以构建什么样的应用程序。

      它确实需要一台具有良好 GPU 的机器。如果您在 FF 中遇到问题,也可以尝试 Chrome。祝您好运,谢谢。

      2014 年 4 月 11 日 下午 12:19

本文的评论已关闭。