浏览器中播放RTSP流的调研及实现方案比较

1,103 阅读3分钟

实时流媒体播放调研

目前主流的浏览器(如 Chrome、Firefox、Safari)在默认情况下是不直接支持 RTSP(Real-Time Streaming Protocol)流的播放的,因为 RTSP 是一种常用于实时流媒体传输的协议,而不是浏览器常见的 HTTP 协议。

一、浏览器插件方式

2015年之前某些浏览器确实支持 VLC(VideoLAN Client)插件,开发人员可以使用 VLC 插件来在支持的浏览器中嵌入 VLC 播放器,并通过该插件实现对 RTSP 流的播放。这种方式允许在浏览器中直接显示和播放 RTSP 视频流。

从2015年开始,由于安全性和性能等方面的考虑,许多主流浏览器逐渐停止对第三方插件的支持。其中包括 VLC 插件。因此,现代浏览器(如 Chrome、Firefox 和 Safari)不再原生支持 VLC 插件,并且无法通过简单安装插件来实现在浏览器中播放 RTSP 流。(团队运营的收费插件好像可以)

二、视频转码

flvjs + ffmpeg + websocket + node

核心为 使用bilibili 开源的 flvjs,原理是在后端利用 转流工具 FFmpeg 将 rtsp流 转成 flv流,然后通过 websocket 传输 flv流,在利用 flvjs 解析成可以在浏览器播放的视频。(延迟2s以内

电脑安装ffmpeg,使用Express和WebSocket实现的本地服务器,用于处理RTSP视频流并通过WebSocket进行传输。

node-rstsp.PNG

页面中链接数据并绘制视频

flvjs.PNG

其他转码方案类似上述核心流程

  • 优点:
    • 可扩展性强:使用Node.js 进行服务器端开发和结合 flvjs 库在浏览器中接收并播放 FLV 格式的视频流,同时使用 FFmpeg 对 RTSP 视频流进行转码和处理,这个方案的架构和组件相对分离,使得系统更具可扩展性。
    • 支持广泛:FLV 格式的视频流在浏览器中播放的兼容性较好,可以在多个浏览器和平台上进行播放。
  • 缺点:
    • 延迟相对较高:由于 RTSP 流经过了编码、传输、解码等步骤,再通过 WebSocket 传输到浏览器进行播放,整个过程会带来一定的延迟,不太适合对实时性要求较高的应用场景。
    • 需要额外的服务器:需要搭建一个 Node.js 服务器来处理 RTSP 流和 WebSocket 连接,增加了部署和维护的成本。

三、WebRTC实现rtsp流在浏览器中播放(不转码

通过webrtc-streamer实现(基于 WebRTC 技术的一个开源流媒体服务器)

wws.lanzouy.com/inBMK08uv02… (webrtc-streamer下载链接)

github.com/mpromonet/w… (GitHub地址文档)

浏览器支持程度如下

canUse-WebRTC.PNG 需要启动WebRtcStreamer服务,只支持h264 视频编码不支持h265。

下载压缩包中的两个文件复制到项目中并在index.html中引入

    <script src="./webrtcstreamer.js"></script>
    <script src="./adapter.min.js"></script>

启动WebRtcStreamer服务,在页面中创建一个WebRtcStreamer对象,并将其连接到指定的RTSP视频流

let webRtcServer = new WebRtcStreamer('video', location.protocol + '//127.0.0.1:8000')
webRtcServer.connect('rtsp://admin:YOYHSH@10.7.187.22:554/h264/ch1/main/av_stream')
  • 优点:
    • 实时性强:webrtc-streamer 使用 WebRTC 技术,可以直接在浏览器中进行实时传输和播放,适用于对实时性要求较高的应用场景。
    • 简化流程:webrtc-streamer 提供了一套完整的解决方案,包括自己的服务器端和客户端代码,使用起来相对简单。
  • 缺点:
    • 兼容性较差:WebRTC 技术的兼容性在不同浏览器和平台上存在差异,可能需要针对不同浏览器做适配和调试。
    • 配置复杂:使用 webrtc-streamer 需要配置 STUN/TURN 服务器、NAT 穿越、SSL/TLS 配置等参数以确保互通性,这一过程可能较为繁琐。

四、总结

  • 如果对实时性要求不高,并且希望实现简单、稳定的方案,可以选择 flvjs + ffmpeg + websocket + node 方案。
  • 如果对实时性要求较高,并且愿意处理一些兼容性和配置的问题,可以考虑 webrtc-streamer 方案。它能够在浏览器中直接进行实时传输和播放。