注册
web

耗时两周,我终于自己搭了一个流媒体服务器

RTSP流媒体播放器


前言:因公司业务需求,研究了下在web端播放rtsp流视频的方案,过程很曲折,但也算是颇有收获。


播放要求



  • web网页播放或者手机小程序播放
  • 延迟小于500ms
  • 支持多路播放
  • 免费

舍弃的方案



  • 【hls】延时非常高,有时候能达到几十秒,实时性场景直接pass
  • 【转rtmp】需要借助flash插件
  • 【转图片帧】需要后端借助工具将rtsp视频流每一帧转成图片,再通过websocket协议实时传输到前端,前端用canvas绘制,这种方法对后端转流要求较高,每张图片如果太大会掉帧,延时也不稳定

思路尝试


1、 flvjs + ffmpeg + websocket + node



这套方案的核心为 BiLiBiLi 开源的 flvjs,原理是在后端利用 转流工具 FFmpegrtsp流 转成 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目录下即可放心食用



image.png
前端部分:



因为前端部分相关的视频库都存在部分协议不支持,没办法完全进行测试


故选择了ZLM官方推荐的 h265webjs这个播放库,经过测试,便捷容易,可安全食用
地址:




作者:xiaoxu_JJ
来源:juejin.cn/post/7399564369229496358

0 个评论

要回复文章请先登录注册