使用 HTML5 websockets 实现基于 web 的实时视频聊天

Posted

技术标签:

【中文标题】使用 HTML5 websockets 实现基于 web 的实时视频聊天【英文标题】:Implementing webbased real time video chat using HTML5 websockets 【发布时间】:2011-05-12 08:43:55 【问题描述】:

有谁知道如何使用 html5 websockets 在 web 应用程序中通过 IP 实现语音/视频?

如果我可以用 php 或 Python 来实现它会很好,因为我(很遗憾)目前不知道任何其他编程语言。

一个好的教程就可以了,还有一个我必须付费的已经构建的解决方案。

更新 1:添加了视频,因为它不仅与音频/voip 相关。

更新 2:第一个 HTML5 视频会议应用程序已经创建。查看我自己的答案

【问题讨论】:

您打算在开源许可下发布它吗?我敢打赌,一旦你得到它的大部分工作,如果你这样做了,你可以利用大量的社区帮助。 是的,就是这样 :-) 我必须先做一些研究和计划。之后,我将通过进一步的通知更新此问题。 getUserMedia() 是这里的关键。 视频建议:twilio.com/docs/api/video 和 voip:twilio.com/docs/api/client 【参考方案1】:

webrtc 现在是答案。

对于 node.js 堆栈 - 你可以查看 http://www.easyrtc.com/ 。请注意,IE 尚未构建对使 webrtc 工作的 API 的支持。

【讨论】:

【参考方案2】:

@work/得快点

查看 javascript getUserMedia(CanIUse) - API (W3)

【讨论】:

【参考方案3】:

WebRTC 可能是一个答案:http://www.webrtc.org/running-the-demos (目前只有启用了 MediaStream 标志的 Chrome Canary)

查看演示:https://apprtc.appspot.com(确保您在正确的浏览器中观看)和代码http://code.google.com/p/webrtc-samples/source/browse/trunk/apprtc/


我写这篇文章的原因是……我买了非常便宜的 android 平板电脑,并且无法在美国以外安装 Skype、Vtok 和 Google Voice。我需要找到基于 HTML5 的解决方案,因为我能够运行 Opera Mobile 12 并让 http://html5demos.com/ 正常工作

【讨论】:

【参考方案4】:

似乎爱立信创建了第一个 HTML5 视频会议应用程序。

他们使用的技术:

实现了设备元素和 Stream API(设备元素 GUI 目前是用 JavaScript/CSS 编写的) 添加了 MediaStreamManager 以将 Stream URL 映射到媒体后端中的相应管道 添加了 MediaStreamTransceiver 来控制相关的媒体处理和传输 在 WebSocket 协议中添加了对二进制数据的支持

见:labs.ericsson.com:


YouTube 上的视频:Beyond HTML5: Conversational Voice and Video demo | Ericsson Labs

不幸的是,爱立信不想分享device_dialog.js(还)。

【讨论】:

问题是爱立信演示仅适用于他们“计划”发布的修补过的 webkit。您也可以使用 flash 来执行此操作,但仍将其称为 html5 ;-) 非常正确,这就是为什么我们要自己构建它,我们的方式:-)【参考方案5】:

如果您只想使用 HTML5,则需要一个实现 HTML 媒体捕获 草稿(here 可用)的浏览器,以便从麦克风访问原始数据。

一旦您掌握了这些数据,您就需要通过网络发送它。 Websockets 将是 HTML5 选项,可以与服务器进行足够快的往返(同时发送本地音频数据和接收远程音频数据)

既然你提到了python,我建议你看看websockets的twisted implementation。

您可以让您的所有客户端使用 callerID 在 websocket 服务器上“注册”,这样服务器就知道在哪里可以找到给定的 callerID。

那么您的服务器将需要一个“邀请”API,调用者1“邀请”调用者2。

一旦建立呼叫并且每个客户端开始发送其音频数据,服务器将能够将此音频数据发送给另一方。

在接收到音频数据后,浏览器需要在扬声器上播放此音频数据,可能使用 HTML5 音频标签。

为此,您可能不得不使用“技巧”:您可能需要模拟 2 个“无限”文件,而不是让 websocket 服务器将原始音频数据转发给客户端:

    caller1.wav : 在 caller1 麦克风上捕获的声音 caller2.wav:在 caller2 麦克风上捕获的声音

一旦调用建立,caller1 浏览器将在 audio.src 属性中添加 caller2.wav(caller1 将通过 websocket 获知此事件),并且希望如果 python 服务器将原始音频数据附加到 caller2.wav收到它,它会开始播放。

这听起来像是一个很酷的原型,你要破解!

祝你旅途愉快,

杰罗姆·瓦格纳

【讨论】:

非常感谢!似乎还有一个 HTML5 视频标签,所以我也可以添加流视频。关于一个问题:you may be forced to use a "trick"。你能解释一下原因吗? “技巧”,因为 1/ 我不确定是否有 API 可以播放原始音频数据,因此您需要使用音频标签 2/ 我认为如果您创建,质量会很差每个原始数据块有 1 个音频标签,因此您需要诱使浏览器认为只有 1 个音频文件。如果您有工作,请随时通知我! 嘿杰罗姆,感谢您的出色贡献 :-) 非常感谢!我打算把它变成一个开源项目。首先,我将从计划和通常的东西开始。如果您对其进展感兴趣,请不时访问此问题。我将在此处发布更新。 嗨,我也在研究这个,你有没有运气让它工作? @JeromeWAGNER,为了改善延迟,我们如何实现它,使视频直接从客户端 A 流式传输到客户端 B,而不是让服务器作为中介?

以上是关于使用 HTML5 websockets 实现基于 web 的实时视频聊天的主要内容,如果未能解决你的问题,请参考以下文章

WebSocket 实战

WebSocket 实战

WebSocket 实战

HTML5基于TCP的全双工通信协议WebSocket

基于WebSocket实现网页版聊天室

iPhone 3GS 上的 HTML5 WebSocket