核心是选对轻量、协议全、开箱即用的流媒体服务器镜像,并配通推流、转协议、播放三环节:tiangolo/nginx-rtmp(RTMP+HLS)、ossrs/srs(全协议)、aler9/rtsp-simple-server(RTSP专用)、mpromonet/webrtc-streamer(WebRTC低延迟);需正确映射端口(如1935、8080)、挂载配置、用FFmpeg或OBS按标准地址推流,再依协议选VLC、Safari、video.js或浏览器直连播放。

用 Docker 实现音视频流媒体分发,核心不是“能不能”,而是“选哪个服务 + 怎么配得稳”。它不依赖你懂多少编解码原理,关键在于选对轻量、协议全、开箱即用的流媒体服务器镜像,并把推流、转协议、播放三个环节串通。
选一个真正适合容器部署的流媒体服务
别从源码编译 Nginx-RTMP 或自己折腾 SRS 编译环境。直接用成熟镜像:
- tiangolo/nginx-rtmp:最简单上手,原生支持 RTMP 推流 + HLS 自动切片,适合 OBS 推流+网页或 VLC 播放;
- ossrs/srs:功能更全,支持 RTMP/HLS/HTTP-FLV/WebRTC,适合想后续扩展低延迟互动场景;
- aler9/rtsp-simple-server:专为摄像头类 RTSP 流设计,零依赖、秒启动、YAML 配置,适合家庭监控或 IPC 转发;
- mpromonet/webrtc-streamer:如果你需要浏览器直看 USB 摄像头或 RTSP 流,且要求毫秒级延迟,它就是最轻量的 WebRTC 入口。
一条命令跑起来,但必须映射对端口和配置
以 nginx-rtmp 为例,仅运行容器远远不够,要让外部能推、能播,必须显式暴露协议端口并支持自定义配置:
- RTMP 默认走 1935 端口(推流入口),务必用
-p 1935:1935映射; - HLS 播放走 HTTP,默认是 80 端口,加
-p 8080:80可避免与宿主机冲突; - 如需修改直播路径、开启录制或调整 GOP,把自定义
nginx.conf挂载进容器:-v $(pwd)/nginx.conf:/usr/local/nginx/conf/nginx.conf; - 容器启动后,用
docker logs -f nginx-rtmp实时看日志,确认 RTMP server 启动成功、监听正常。
推流不靠猜,FFmpeg 和 OBS 都能精准打点
推流地址格式统一为 rtmp://[服务器IP]:1935/[app]/[stream],常见组合有:
- OBS 设置里选“自定义流媒体服务器”,填
rtmp://192.168.1.100/live,密钥写camera01,推流地址就变成rtmp://192.168.1.100/live/camera01; - 用 FFmpeg 推本地文件循环播:
ffmpeg -re -stream_loop -1 -i sample.mp4 -c copy -f flv rtmp://localhost/live/test; - 拉 RTSP 摄像头再转 RTMP:
ffmpeg -i rtsp://admin:12345@192.168.1.50:554/stream1 -c:v libx264 -c:a aac -f flv rtmp://192.168.1.100/live/ipcam; - 注意:
-c copy表示不重编码,纯封装转发,CPU 占用极低;需要转码时才加-c:v libx264等参数。
播放端按协议选工具,别硬套一个地址
同一套流媒体服务常同时输出多种协议,不同终端适配不同地址:
- RTMP:VLC 打开“网络串流”,输入
rtmp://192.168.1.100/live/test,延迟 1–3 秒; - HLS:Safari / iOS 直接打开
http://192.168.1.100:8080/live/test.m3u8,兼容性最好; - HTTP-FLV:Chrome / Edge 可用 video.js + flv.js 播放
http://192.168.1.100:8080/live/test.flv,比 HLS 延迟更低; - WebRTC:若用 webrtc-streamer,浏览器访问
http://192.168.1.100:8000/webrtc?name=stream0即可,延迟可压到 500ms 内。


















