第一次写博客,留个脚印先。
问题描述:
用支持html5的浏览器,不安装插件,能够播放rtsp协议的视频。
可选技术路线:
1. nodejs + ffmpeg + jsmpeg
这个路线我没有亲测,有一个地方不太优雅,就是要调用ffmpeg进程进行视频重编码到mp1,有网友认为不适合在生产环境下使用。
2. + streamedian server
streamedian 是开源的,自带rtsp协议解析和h264视频格式播放功能,在github上有, streamedian server 可以从网站上下载,免费版只支持本机播放,怎么付费网站也没写。
3. 浏览器安装vlc插件
vlc在chrome 41以上的版本用不了,属于flash一类在网页上面将被淘汰的东西,并且要求用户都装插件也不太方便。
搞了4天,最后我选了作为前端,自己写一个服务替换streamedian server。
方案构成:
+ websocket server(主要嫁接websocket 与 rtsp通讯)
websocket server: 采用 Core websocket库,其中middleware架构学习了/blog/aspnet-core-websockets-middleware/
rtsp通讯:由于自带了rtsp报文解析,因此服务端主要是解析建立双通道的RTSP报文,一个是INIT,一个是JION。INIT是控制报文使用的websocket链接,JOIN是数据报文(RTP)使用的websocket链接,两者都关联1个RTSP socket链接。
再就是当接受rtsp报文时需要根据报文内容分流为数据报文和控制报文。
关于rtsp的客户端代码实现主要参考了github上的sharprtsp,但这个代码性能实在不行。还有一个codeproject上的net7mma对视频流解析实现的比较完善,但代码过于复杂且没什么例子,对我这个方案借鉴意义不大。
代码实现:
通用的websocket架构,复制过来的;
当收到报文时区分数据(以$字节开头)、控制,分别入队;
主要处理websocket接受转发给rtsp,以及rtsp队列出队转发给websocket。
性能优化考虑:
读取后不要直接转发,入队缓冲,以免堵塞rtsp流;
采用异步编程;
3.每次出队多组报文,减少lock造成的性能损失。
代码下载:
网盘:/s/1qkyWGCyrAER0DYYBwww2YA 提取码: itkt
****: /download/xhydongda/10761929
关闭websocket:
某些摄像头(如宇视)要求发送teardown报文。
for (let session in ) {
await [session].sendTeardown();
}
在收发数据catch到Exception后调用await ()关闭websocket链接
注意:await ()在目前的 core2.1和2.2 preview版本有bug,会抛出没有发送关闭握手异常。。