最近在做的一个小项目需要用到相关技术,找到这篇文章貌似不错,于是就翻译转载上来了。
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.

原文地址 / Original post:
HTML5 Live Video Streaming via WebSockets - PhobosLab

笔者之前做一个实时监控应用的时候,曾搜索过一些将 iPhone 的摄像头拍摄的画面实时传输到浏览器的方案,一个都没有。

就 HTML5 来说,视频(实时)直播是一个很悲催的活,HTML5 视频目前还没有一个正式的流式传输支持,Safari 支持很蹩脚的 HTTP Live Streaming 并且也即将有 Media Source Extension 规范和 MPEG-DASH。但所有这些方案都是将视频分成小片,由浏览器单独下载,因此会产生最小五秒钟的延迟。

下面是一个完全不同的方案,可以支持所有现代浏览器:Firefox、Chrome、Safari、Mobile Safari、Android 版 Chrome 甚至是 IE10。

原文的这个位置提供了一个直播例子。

这套方案向后兼容,没有用到什么新奇技术,目前暂时不支持音频。但它出乎意料地好用。

来自摄像头的视频被 ffmpeg 编码,然后通过 HTTP 传递给一个 Node.js 写的小脚本;脚本会将这条 MPEG 视频流通过 WebSockets 分发给所有链接的浏览器;浏览器使用 JavaScript 解码 MPEG 视频流并将解码后的画面渲染到 Canvas 元素上。

你甚至可以用树莓派来传输视频。可能会有点慢,但是笔者测试过以 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

你可能感兴趣的文章

14 条评论
ChenKan · 2014年01月21日

到处都有ffmpeg的身影啊

回复

weakish · 2014年01月21日

用 JavaScript 解码 MPEG 视频流并将解码后的画面渲染到 Canvas 元素上

这个效率……

回复

sumory · 2014年07月20日

很关心js解码部分效率和资源占用率

回复

leecade · 2014年11月03日

这个方案根本不行, 树莓派处理不过来, 延迟很大, 推荐 mjpg-streamer

回复

wuwei · 2015年05月13日

有没有详细的方案分享一下,近期我在做一个项目,需要从监控摄像头获取实时画面并且展现到网页上,后台使用java写,前端使用php

回复

娃娃脾气 · 2015年08月27日

客户端播放效率根本不行!
Canvas渲染成为瓶颈,甚至远远不如flash。

回复

0

webGL

yinzSE · 1月29日
心是透明的1986 · 2015年12月04日

JS解码?Canvas渲染?太扯了。。。。用flash byteArray解码和BitmapData渲染都比它强,更何况flash本身就自带解码器

回复

黒之染 · 2016年05月25日

这个只是让移动设备看直播,而不是录制直播吧?有让移动设备录制的功能吗?

回复

marszone · 2016年08月25日

这个我们公司项目已经在用了。。但是最大问题是,html5的声音问题。

回复

0

好像很卡顿,您使用的时候会卡顿吗

jonahzheng · 6月20日
编号191 · 2016年10月24日

你好我的这个视频掉帧严重canvas中全是花屏的请问如何处理

回复

i一切随风 · 2016年12月01日

这个如果有多个视频源的话,怎么发布呢?

回复

zgy520 · 2016年12月12日

你好,你的那个项目做好了吗?我最近也在做这样的项目,遇到了一些困难,不知是否可以交流一下!我用的后台也是java!需要将摄像头的视频流实时的在浏览器上呈现出来

回复

载入中...
XiNGRZ XiNGRZ

1k 声望

发布于专栏

9up

6 人关注