HTML5不能直接播放RTSP流,因其video标签仅支持MP4、WebM等格式,不识别RTSP协议;需通过服务端转封装为HLS或MSE兼容格式,如用ffmpeg拉流生成HLS切片,再由nginx静态托管供hls.js播放。

HTML5 能不能直接播 RTSP 流
不能。HTML5 的 标签原生只支持 MP4(H.264/AAC)、WebM、Ogg 等封装格式,完全不识别 RTSP 协议。浏览器发起的任何 RTSP 请求都会被拦截或直接失败,常见表现是控制台报 ERR_CONNECTION_REFUSED 或静默无响应。
所以“HTML5 播 RTSP”本质是绕过协议限制:把 RTSP 流在服务端转成浏览器能吃的格式,比如 HLS(.m3u8)或 MSE 支持的 fragmented MP4(mp4 或 flv)。
nginx 本身不支持 RTSP 转发或转码
标准版 nginx 是 HTTP/HTTPS 反向代理,没有内置 RTSP 客户端能力,也不能解析、拉取、转封装 RTSP 流。你配了 rtsp:// 地址到 location 块里,它根本不会去连——只会返回 404 或 502。
真正能干这事的是专用流媒体服务器,比如:
立即学习“前端免费学习笔记(深入)”;
-
ffmpeg(命令行拉流 + 推 HLS/MP4/FLV) -
ffserver(已弃用,不推荐) -
nginx-http-flv-module(需编译进 nginx,支持 RTMP/HTTP-FLV) -
EasyDarwin/SRS/Janus Gateway(支持 RTSP 拉流 + WebRTC/HLS 输出)
其中 nginx-http-flv-module 是最贴近“用 nginx 干 RTSP 事”的方案,但它依赖外部工具(如 ffmpeg)先把 RTSP 转成 RTMP,再由带模块的 nginx 提供 FLV 流。
最小可行架构:ffmpeg + nginx(静态 HLS)
如果只是临时调试或小规模展示,不用复杂服务,推荐这个组合:用 ffmpeg 拉 RTSP、切片生成 HLS,nginx 当静态文件服务器托管 .m3u8 和 .ts 文件。
实操要点:
- 运行命令:
ffmpeg -i "rtsp://192.168.1.100:554/stream" -c:v copy -c:a aac -f hls -hls_time 2 -hls_list_size 10 -hls_flags delete_segments /var/www/html/live/index.m3u8 - 确保
/var/www/html/live/在 nginx 的root配置下可访问(如location /live { alias /var/www/html/live; }) -
前端用
加hls.js播放:https://yoursite.com/live/index.m3u8 - 注意
-c:v copy仅当源流编码(H.264)和容器(HLS)兼容时可用;否则必须重编码,CPU 占用飙升
为什么别硬套“nginx 转发 RTSP”这种说法
网上很多教程写“nginx 配置 RTSP”,实际是混淆了三件事:RTSP 代理(极少用,且需第三方模块如 nginx-rtmp-module 的实验性支持)、RTMP 中继(nginx-rtmp-module 原生支持)、以及把 nginx 当静态资源网关用。真正的协议转换发生在 ffmpeg 或 SRS 这类服务里。
最容易被忽略的点是:RTSP 流常带鉴权(rtsp://user:pass@...),而 ffmpeg 拉流时若密码含特殊字符(如 @、/),必须 URL 编码,否则连接直接失败——这不是 nginx 的锅,但排查时往往先怀疑它。










