采集rtsp流摄像头到浏览器实时播放方案

本文旨在实现使用摄像头采集视频,并且可以在网页实时显示,主要参考的两篇博文为: 
1.  视频实时显示的三种方案  
2.  使用WebSockets进行HTML5视频直播  
我们使用博文1介绍的第三种方案,将摄像头采集到的视频流使用ffmpeg进行编码,并且将其推送给远程服务器,在远程服务器使用stream-server.js处理视频流并且在网页上显示出来。由于原博文介绍详尽,本处不再赘述。 
注意 : 
1. 客户端电脑中需要预先安装ffmpeg,安装方案谷歌即可。 

2. 博文1中第三种方案安装nodejs过程中sudo apt-get install node-legacy 应该改为sudo apt-get install nodejs-legacy。

最近在做一个流媒体的项目,项目中需要采集摄像头的视频流到网页界面实时播放,一般ip摄像头的流格式都是rtsp的,虽然可以通过vlc实时播放,但是不如浏览器观看给用户的体验简单。

根据查找的资料和实际的实践,目前发现的切实可行的方案有以下几种(因为项目是采用java开发,因此下面的代码也主要使用java实现):

  1. 使用xuggle库直接解码rtsp流,将解码的一帧帧图片发送给浏览器,使用html5的video播放mjpeg格式,即图片的不断刷新;

  2. 使用xuggle库直接解码rtsp流,解码结果直接发送给rtmp服务器,然后浏览器使用flash直接播放rtmp的视频流;

  3. ffmpeg直接解码rtsp流,将解码结果使用http发送到nodejs服务器,nodejs服务器使用websocket发送给客户端,客户端使用canvas实时绘制图像;

下面详细介绍这几种方案。

FFmpeg和Xuggle的简介

FFmpeg是一个自由软件,可以运行音频和视频多种格式的录影、转换、流功能,包含了libavcodec——这是一个用于多个项目中音频和视频的解码器库,以及libavformat——一个音频与视频格式转换库。
FFmpeg的安装请参考:ubuntu上安装ffmpeg

xuggle官网是一个开源的资源库,能够让开发者更好的去对视频和音频文件进行解码、编码、以及录制等功能。xuggle是对ffmepg的封装,是一套基于ffmpeg的开发库。 使用非常方便。 在java中使用时,请在eclipse中导入其jar包。 xuggle-5.4-jar包下载

方案一的具体实现

xuggle读取rtsp摄像头的代码如下:
import包如下:

其中:streamLocation是需要读取的rtsp地址

上面这段代码实现了rtsp的持续读取,那么读取到的数据怎么获取,很简单,实现以下的帧回调函数onVideoPicture即可。

以上的images是使用guava库的Cache建立的代码如下:

使用html5 video标签+javax.ws.rs实现的网页显示代码如下:

以上代码参考自github上stormcv项目,项目地址为:https://github.com/sensorstorm/StormCV, 感谢原作者。

至此,打开网页 http://localhost:8558/streaming/tiles 即可查看到实时视频。

方案二的具体实现

xuggle库转rtsp为rtmp

rtsp的reader:

rtmp服务器的搭建方法请参考这里。

rtmp的writer:

到这里已经实现了rtsp流推送到rtsp的服务器。下一步即为rtmp流的显示。使用的是flowplayer

FlowPlayer 是一个用Flash开发的在Web上的视频播放器,可以很容易将它集成在任何的网页上。支持HTTP以及流媒体传输。

FlowPlayer的示例程序可以点击此处下载。(FlowPlayer是商业软件,此处仅作测试,请支持正版)

下载flowplay并实现以下的html,即可。

启动rtmp服务器,实例化上面的RTSPReader类并传入相应的rtsp摄像头地址,再打开这个网页即可看到摄像头直播。可以使用VLC打开rtsp流对比观看。
rtsp示例地址: rtsp://streaming3.webcam.nl:1935/n224/n224.stream

另外推荐一个世界各地的摄像头直播网站,很有趣: 世界各地的摄像头

ffmpeg 命令直接 转rtsp为rtmp

上面是使用java库转rtsp为rtmp。
ffmpeg直接就可以通过命令将rtsp转rtmp

方案三的具体实现

这套方案参考地址为:使用 WebSockets 进行 HTML5 视频直播 – SegmentFault

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

  1. 安装nodejs

  1. 下载 phoboslab/jsmpeg 项目的 stream-server.js 脚本。安装 WebSocket包ws并启动服务器:

这里的密码是用来确视频流不被劫持用的。如果服务器运行正常,你应该会看到这样的输出:

  1. 服务器启动后,你就可以启动 ffmpeg 并将它指向到正在运行的这个域名和端口了:

这条命令会开始从rtsp流捕捉 640×480 的视频,并编码成 25fps 码率的 MPEG 视频。编码后的视频会通过 HTTP 被发送到所指定的服务器和端口。确保密码正确,URL 中的长和宽也需要正确指定,否则服务器无法正确判断当前的分辨率。

  1. 要观看直播,需要从前文提到的 jsmpeg 项目中下载 stream-example.html 和 jsmpg.js 文件,更改 stream-example.html 中的 WebSocket URL 为你的服务器地址,并使用你喜欢的浏览器打开。

如果一切正常,你就能看到摄像头画面。

总结

以上三种方案得到的结果都会有延时,具体的分析未完待续。


转载请保留原文链接。本文内容均为实践后的学习整理,本人拥有所有解释权。如本文侵犯了你的版权,请联系作者yanhealth@163.com进行删除。

就 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


评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值