HTML5不支持RTSP协议,必须通过服务端转流为HLS或WebRTC等浏览器兼容格式;HLS延迟高(10–30秒)但兼容性好,WebRTC延迟低但部署复杂。
浏览器原生 标签根本不认识 rtsp:// 协议,这不是前端能“加个库”绕过去的限制,而是协议层彻底不兼容。RTSP 是控制协议(带 SETUP/PLAY),而 HTML5 只接受基于 HTTP 的流(如 HLS、MPEG-DASH)或 WebRTC 的信令+数据通道。所以所有“HTML5 播放 RTSP”的方案,本质都是:先用服务端把 RTSP 流转成浏览器能吃的格式,再让前端加载。
HLS 延迟高(通常 10–30 秒),但兼容性极好(Safari、Chrome、Android WebView 全支持),部署简单;WebRTC 延迟低(RTCPeerConnection 的 H.264 支持不稳定,Android 旧版 WebView 也不一定支持。
HLS,用 ffmpeg + nginx-http-flv-module 或 gstreamer 推 HLSWebRTC,推荐用 Janus Gateway 或 Mediasoup 接入 RTSP 源rtsp-relay、hls.js 加 ffmpeg.wasm 都扛不住持续视频帧,CPU 爆表且卡顿严重这是最轻量、调试最快的起步方式,适合测试和小规模部署:
ffmpeg -i "rtsp://admin:password@192.168.1.100:554/stream1" \ -c:v libx264 -c:a aac \ -f hls \ -hls_time 2 \ -hls_list_size 3 \ -hls_flags delete_segments \ /var/www/html/live/stream.m3u8
注意几个关键点:
立即学习“前端免费学习笔记(深入)”;
-hls_time 2:每个 ts 片段 2 秒,太小会增加 HTTP 请求压力,太大延迟更高
root),前端用
ffmpeg 日志会卡在 Authentication failed
-rtsp_transport tcp 参数用 Janus 或 Mediasoup 接 RTSP 后,前端看似只是调 new RTCPeerConnection(),但实际卡点都在服务端和网络配置上:
videoroom 插件默认不拉流 RTSP,要启用 rtsp 插件并配 rtsp_url 和 rtsp_user/rtsp_pwd
ice_servers 如果只写 stun:stun.l.google.com:19302,公网用户可能无法连通,必须配好自己的 TURN 服务,或至少 fallback 到 iceTransportPolicy: "relay"
真正跑通前,先用 ffplay rtsp://... 和 curl http://your-hls-domain/live/stream.m3u8 确认源和转流都活,再动 WebRTC。一步跨太多,问题根本分不清是推流断了、信令没通,还是 SDP 交换失败。