最近在作的一个小项目须要用到相关技术,找到这篇文章貌似不错,因而就翻译转载上来了。 Recently I'm interesting in these technologies and I'm working on a project related to it. I've found this useful article so I translated and posted it here.node
原文地址 / Original post:
HTML5 Live Video Streaming via WebSockets - PhobosLabjquery
笔者以前作一个实时监控应用的时候,曾搜索过一些将 iPhone 的摄像头拍摄的画面实时传输到浏览器的方案,一个都没有。linux
就 HTML5 来讲,视频(实时)直播是一个很悲催的活,HTML5 视频目前尚未一个正式的流式传输支持,Safari 支持很蹩脚的HTTP Live Streaming 而且也即将有 Media Source Extension 规范和 MPEG-DASH。但全部这些方案都是将视频分红小片,由浏览器单独下载,所以会产生最小五秒钟的延迟。nginx
下面是一个彻底不一样的方案,能够支持全部现代浏览器:Firefox、Chrome、Safari、Mobile Safari、Android 版 Chrome 甚至是 IE10。git
原文的这个位置提供了一个伪直播例子。github
这套方案向后兼容,没有用到什么新奇技术,目前暂时不支持音频。但它出乎意料地好用。web
来自摄像头的视频被 ffmpeg 编码,而后经过 HTTP 传递给一个 Node.js 写的小脚本;脚本会将这条 MPEG 视频流经过 WebSockets 分发给全部连接的浏览器;浏览器使用 JavaScript 解码 MPEG 视频流并将解码后的画面渲染到 Canvas 元素上。sql
你甚至能够用树莓派来传输视频。可能会有点慢,可是笔者测试过以 30fps 的帧率实时编码 320x240 视频不成问题。对笔者来讲这是最好的树莓派视频方案。
下面是构建步骤。首先你须要取得最新版本的 ffmpeg,最新的安装包能够从 deb-multimedia 得到。若是你使用 Linux,你的摄像头应该在位于 /dev/video0
或 /dev/video1
;在 OS X 或 Windows 上你能够用 VLC。
确保用来分发视频流的服务器安装了 Node.js。下载 phoboslab/jsmpeg 项目的 stream-server.js 脚本。安装 WebSocket 包 ws
并启动服务器:
npm install ws node stream-server.js 你的密码
这里的密码是用来确保不会有好奇宝宝来劫持你的视频流用的。若是服务器运行正常,你应该会看到这样的输出:
Listening for MPEG Stream on http://127.0.0.1:8082/<secret>/<width>/<height> Awaiting WebSocket connections on ws://127.0.0.1:8084/
服务器启动后,你就能够启动 ffmpeg 并将它指向到正在运行的这个域名和端口了:
ffmpeg -s 640x480 -f video4linux2 -i /dev/video0 -f mpeg1video -b 800k -r 30 http://example.com:8082/你的密码/640/480/
这条命令会开始从摄像头捕捉 640x480 的视频,并编码成 30fps 码率 800kbps 的 MPEG 视频。编码后的视频会经过 HTTP 被发送到所指定的服务器和端口。确保密码正确,URL 中的长和宽也须要正确指定,不然服务器没法正确判断当前的分辨率。
在树莓派上你可能须要将分辨率降至 320x240 来确保编码速度仍能维持 30fps。
要观看直播,须要从前文提到的 jsmpeg 项目中下载 stream-example.html 和 jsmpg.js 文件,更改 stream-example.html 中的 WebSocket URL 为你的服务器地址,并使用你喜欢的浏览器打开。
若是一切正常,你就能看到少于 100ms 延迟的流畅的摄像头画面。很好很强大对不?
更便捷的方案请围观原文的 Instant Webcam。
只是备忘一下,近期会再发一篇博文来总结一下各个方案的实际使用效果。
重复一次原文地址 / Original post:
HTML5 Live Video Streaming via WebSockets - PhobosLab