第一次写博客,留个脚印先。
用支持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
某些摄像头(如宇视)要求发送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,会抛出没有发送关闭握手异常。。