耗时两周,我终于自己搭了一个流媒体服务器
RTSP流媒体播放器
前言:因公司业务需求,研究了下在web端播放rtsp流视频的方案,过程很曲折,但也算是颇有收获。
播放要求
- web网页播放或者手机小程序播放
- 延迟小于500ms
- 支持多路播放
- 免费
舍弃的方案
- 【hls】延时非常高,有时候能达到几十秒,实时性场景直接pass
- 【转rtmp】需要借助flash插件
- 【转图片帧】需要后端借助工具将rtsp视频流每一帧转成图片,再通过websocket协议实时传输到前端,前端用canvas绘制,这种方法对后端转流要求较高,每张图片如果太大会掉帧,延时也不稳定
思路尝试
1、 flvjs + ffmpeg + websocket + node
这套方案的核心为 BiLiBiLi 开源的
flvjs
,原理是在后端利用 转流工具 FFmpeg 将rtsp流
转成flv流
,然后通过websocket
传输flv流
,在利用flvjs
解析成可以在浏览器播放的视频。flv不支持ios 请自行取舍
2、WebRTC
Webrtc是前端的技术,后端使用有点困难,原理是将
rtsp流
转成webrtc流
,直接在video中播放(需要浏览器支持webrtc)
如何将rtsp转成webrtc 基于两个工具实现
参考链接1 :webrtcstreamer.js 前端实现
参考链接2 : mediamtx转流
3、jsmpeg.js + ffmpeg + websocket + node
这种方案是我测试过免费方案中效果最好的,原理是在后端利用 转流工具 FFmpeg 将
rtsp流
转成图片流
,然后通过websocket
传输图片
,在利用jsmpeg.js
绘制到canvas上显示
优点:
- 可以通时兼容多路视频,且对浏览器内存占用不会太高
- 延迟还可以 测试在300-1000ms左右
缺点:
- 多路无法使用主码流 会把浏览器卡死
- 清晰度不够,画面大概在720p左右
前后端代码放jsbin了 地址 :jsbin.com/hazacak/edi…
注意
使用时请下载ffmpeg 并把ffmpeg添加值环境变量
4 、终极方案:ZLMediaKit +h265webjs
该方案应该是此类问题的终极解决方案(个人认为,有好的方案请共享)
原理:
可以看到ZlMediaKit支持把各种流进行转换输出,我们可以使用输出的流进行播放
为了便捷 推荐你使用ZLM文档提供的Docker镜像,同时ZLM提供各种的restful AP供你使用,可以转流,推流等等,具体查看文档中的 restful API部分内容
其中需要注意的是 API中的secret 在镜像文件 /opt/mdeia/conf 文件夹下 请手动复制出来 每次构建镜像 改值会变化
另外 推荐一个ZLM 的管理界面 github.com/1002victor/…
只需要把代码全部复制到 www目录下即可放心食用
前端部分:
因为前端部分相关的视频库都存在部分协议不支持,没办法完全进行测试
故选择了ZLM官方推荐的 h265webjs这个播放库,经过测试,便捷容易,可安全食用
地址:
来源:juejin.cn/post/7399564369229496358