h5无插件 RTSP 摄像头在线播放(用海康摄像头测试)

第一次写博客,留个脚印先。

问题描述:

用支持html5的浏览器,不安装插件,能够播放rtsp协议的视频。

可选技术路线:

1. nodejs + ffmpeg + jsmpeg 

这个路线我没有亲测,有一个地方不太优雅,就是要调用ffmpeg进程进行视频重编码到mp1,有网友认为不适合在生产环境下使用。

2. streamedian.js + streamedian server

streamedian 是开源的,自带rtsp协议解析和h264视频格式播放功能,在github上有, streamedian server 可以从www.streamedian.com网站上下载,免费版只支持本机播放,怎么付费网站也没写。

3. 浏览器安装vlc插件

vlc在chrome 41以上的版本用不了,属于flash一类在网页上面将被淘汰的东西,并且要求用户都装插件也不太方便。

搞了4天,最后我选了streamedian.js作为前端,自己写一个服务替换streamedian server

方案构成:

streamedian.js + websocket server(主要嫁接websocket 与 rtsp通讯)

websocket server: 采用ASP.NET Core websocket库,其中middleware架构学习了https://radu-matei.com/blog/aspnet-core-websockets-middleware/

rtsp通讯:由于streamedian.js自带了rtsp报文解析,因此服务端主要是解析建立双通道的RTSP报文,一个是INIT,一个是JION。INIT是控制报文使用的websocket链接,JOIN是数据报文(RTP)使用的websocket链接,两者都关联1个RTSP socket链接。

再就是当接受rtsp报文时需要根据报文内容分流为数据报文和控制报文。

关于rtsp的客户端代码实现主要参考了github上的sharprtsp,但这个代码性能实在不行。还有一个codeproject上的net7mma对视频流解析实现的比较完善,但代码过于复杂且没什么例子,对我这个方案借鉴意义不大。

代码实现:

WebSocketMiddleware.cs 通用的websocket架构,复制过来的;

RtspProxy.cs 当收到报文时区分数据(以$字节开头)、控制,分别入队;

CameraWebSocketHandler.cs 主要处理websocket接受转发给rtsp,以及rtsp队列出队转发给websocket。

性能优化考虑:

1.socket读取后不要直接转发,入队缓冲,以免堵塞rtsp流;

2.CameraWebSocketHandler 采用异步编程;

3.每次出队多组报文,减少lock造成的性能损失。

代码下载:

网盘:https://pan.baidu.com/s/1qkyWGCyrAER0DYYBwww2YA 提取码: itkt 

CSDN: https://download.csdn.net/download/xhydongda/10761929

关闭websocket:

某些摄像头(如宇视)要求发送teardown报文。

for (let session in player.client.clientSM.sessions) {
  await player.client.clientSM.sessions[session].sendTeardown();
}

在收发数据catch到Exception后调用await socket.CloseOutputAsync()关闭websocket链接

注意:await socket.CloseAsync()在目前的asp.net core2.1和2.2 preview版本有bug,会抛出没有发送关闭握手异常。。

你可能感兴趣的:(a)