HTML5原生不支持RTSP,需服务端转协议(如WebRTC/HLS);弹幕仅WebRTC+时间戳同步+DOM渲染可行,误差容忍±300ms,其他方案均为demo级妥协。
浏览器的 标签只支持 HTTP(S) 协议下的 MP4、WebM、Ogg 等格式,rtsp:// 地址会直接报错或静默失败。所谓“HTML5 播放 RTSP”,实际是靠服务端转协议(如转成 WebRTC、HLS 或 MSE 支持的 fragmented MP4),前端再用对应方式加载。弹幕叠加必须基于这个前提才可讨论。
RTSP 流经服务端(如 ffmpeg + webrtc-streamer、mediasoup、LiveKit)转为 WebRTC 后,前端用 RTCPeerConnection 接收音

{text: "hello", time: 12.345})video.currentTime 做主时钟,结合 requestAnimationFrame 定期比对并渲染/隐藏弹幕timeupdate 事件——它触发不均匀,且在 seek 后可能丢失关键帧position: absolute 叠在 上层,z-index 要高于 video 的 controls(如有)若 RTSP 被转为 HLS(m3u8 + ts),则无法利用 TS 分片内精确 PTS;播放器(如 hls.js)暴露的 hls.media.currentTime 有 100–500ms 滞后,且 seek 后 currentTime 可能跳变。此时弹幕易出现:
hls.on(Hls.Events.FRAG_PARSING_METADATA) —— RTSP 转 HLS 通常不注入 ID3 或 EMSG 元数据有人尝试用 canvas.getContext('2d').drawImage(video, ...) 每帧捕获再叠字,这在 RTSP 场景下几乎不可行:
video 元素无法被 drawImage 正常读取(跨域策略、MediaStream 渲染限制)video.videoWidth/videoHeight 在流启动初期常为 0真正能落地的只有 WebRTC + 时间戳对齐 + DOM 渲染这一条路,其他都是 demo 级妥协。时间轴同步的误差容忍要按 ±300ms 设计,别追求毫秒级精准——RTSP 到 WebRTC 的端到端延迟本身就在 800ms 以上。