流媒体实战(五):Docker 一键部署 SRS 直播服务器,OBS 推流、手机拉流
前四篇把理论讲完了。这一篇就是动手------从零搭一套直播系统:服务器用 SRS,推流用 OBS,观众用手机浏览器看 HLS。一条命令启动,五分钟跑通全链路。
大家好,我是黒漂技术佬。
理论讲再多,不如亲手跑一遍。今天的目标很明确:
- 用 Docker 启动一个 SRS 流媒体服务器。
- 用 OBS 推一路 RTMP 视频流到服务器。
- 用手机浏览器播放 HLS 流,或用 VLC 播 RTMP/HTTP-FLV。
- 如果需要,再加一路 IP 摄像头(RTSP)转 RTMP 推上去。
一、为什么选 SRS,不选 nginx-rtmp?
nginx-rtmp 是上古神器,但问题不少:
- 原维护者已弃坑多年,HLS 有内存泄漏。
- 不支持 WebRTC、SRT 等新协议。
- 配置全靠 nginx.conf,对新手极不友好。
SRS(Simple Realtime Server) 是国产开源流媒体服务器,100% C++ 编写,单进程架构,性能碾压 nginx-rtmp。原生支持 RTMP、HLS、HTTP-FLV、WebRTC、SRT,而且有 Web 管理后台,看一眼就能上手。
项目地址:https://github.com/ossrs/srs
二、Docker 一行命令启动 SRS
确保你装了 Docker(没装的去 docker.com 下载 Docker Desktop,一键安装),然后:
bash
docker run --rm -it -p 1935:1935 -p 1985:1985 -p 8080:8080 -p 8000:8000/udp ossrs/srs:5
四个端口各司其职:
| 端口 | 协议 | 用途 |
|---|---|---|
| 1935 | RTMP | 推流端口,OBS/FFmpeg 往这里推 |
| 8080 | HTTP | HLS/HTTP-FLV 分发,浏览器拉流 |
| 1985 | HTTP API | SRS 的管理 API,查状态/踢流 |
| 8000 | UDP | WebRTC(需要额外配置,本篇先不管) |
启动后访问 http://localhost:8080/,看到一个 SRS 的欢迎页面,说明成了。
三、OBS 推流:你的第一路直播
OBS Studio(obsproject.com)是开源免费的推流软件,主播都在用。
3.1 OBS 设置
- 打开 OBS → 右下角「设置」→「直播」。
- 服务选「自定义」。
- 服务器填:
rtmp://localhost/live/ - 串流密钥填:
room001(随便起,英文+数字即可)。
3.2 推流地址的含义
rtmp://localhost/live/room001
│ │ │
│ │ └── 流名称(stream key),房间号
│ └── 应用名(app),SRS 的虚拟主机
└── SRS 服务器地址
SRS 收到推流后,自动生成多种拉流地址:
| 协议 | 拉流地址 |
|---|---|
| RTMP | rtmp://localhost/live/room001 |
| HTTP-FLV | http://localhost:8080/live/room001.flv |
| HLS (m3u8) | http://localhost:8080/live/room001.m3u8 |
3.3 开始推流
OBS 里加一个「显示捕获」或「视频采集设备」,然后点「开始直播」。
四、观众端:各种方式拉流验证
4.1 VLC 播放器(桌面端)
VLC(videolan.org)是万能播放器。打开 VLC → 「媒体」→「打开网络串流」→ 输入 rtmp://localhost/live/room001 → 播放。延迟约 2~3 秒。
4.2 浏览器播 HTTP-FLV
SRS 自带一个测试播放页:http://localhost:8080/players/srs_player.html。填入 URL http://localhost:8080/live/room001.flv,点播放。
如果想在自己的网页里嵌入,用 flv.js:
html
<script src="https://cdn.jsdelivr.net/npm/flv.js@1.6.2/dist/flv.min.js"></script>
<video id="videoElement" controls autoplay></video>
<script>
if (flvjs.isSupported()) {
var player = flvjs.createPlayer({
type: 'flv',
url: 'http://你的服务器IP:8080/live/room001.flv'
});
player.attachMediaElement(document.getElementById('videoElement'));
player.load();
player.play();
}
</script>
4.3 手机浏览器播 HLS
iOS Safari/Android Chrome 都原生支持 HLS。手机访问 http://你的服务器IP:8080/players/srs_player.html,切到 HLS 模式(或者直接开 http://你的服务器IP:8080/live/room001.m3u8),大概缓冲 5~10 秒后开始播放。
五、进阶:IP 摄像头(RTSP)转 RTMP 推流
监控摄像头普遍输出 RTSP 流(比如 rtsp://admin:12345@192.168.1.64:554/h264/ch1/main/av_stream),这个流格式浏览器播不了。用 FFmpeg 拉 RTSP 转推到 SRS:
bash
ffmpeg -rtsp_transport tcp -i "rtsp://摄像头地址" \
-c:v copy -c:a aac -f flv \
rtmp://localhost/live/cam001
参数解释:
-rtsp_transport tcp:用 TCP 传 RTSP,比默认 UDP 稳定,不丢包。-c:v copy:视频直接复制,不重新编码(省 CPU)。-c:a aac:音频转成 AAC(摄像头可能是 G.711,SRS 不认识)。-f flv:封装成 FLV 格式推到 RTMP。
跑起来后,观众端用 http://localhost:8080/live/cam001.flv 就能看到监控画面了。这就是大棚监控 Web 化的完整链路。
六、生产环境注意事项
6.1 不要只用 Docker 的 --rm
测试可以用 --rm(容器退出就删除),生产环境改成:
bash
docker run -d --restart unless-stopped --name srs \
-p 1935:1935 -p 1985:1985 -p 8080:8080 \
-v ./srs.conf:/usr/local/srs/conf/srs.conf \
ossrs/srs:5
-d 后台运行,--restart unless-stopped 保证宿主机重启后 SRS 自动拉起,-v 挂载自定义配置文件。
6.2 推流码率建议
| 场景 | 分辨率 | 视频码率 | 音频码率 |
|---|---|---|---|
| 监控 / 低带宽 | 640×480 | 500 kbps | 64 kbps |
| 标清直播 | 1280×720 | 1500~2500 kbps | 128 kbps |
| 高清直播 | 1920×1080 | 4000~6000 kbps | 128~192 kbps |
OBS 里:设置 → 输出 → 视频比特率。不要设太高,高了观众网速不够会卡。
6.3 HLS 延迟优化
SRS 默认 HLS 分片 10 秒,延迟约 15~30 秒。如果要降低延迟,在 SRS 配置里改:
hls {
enabled on;
hls_fragment 2; # 分片时长降到 2 秒
hls_window 4; # 播放列表窗口 4 秒
}
这样延迟能降到 5~8 秒,代价是 HTTP 请求更频繁。
6.4 公网访问
本地 localhost 只有自己看。想让外网观众访问:
- 有公网 IP :直接用
http://你的公网IP:8080。防火墙/安全组放行 1935、8080、8000 端口。 - 没公网 IP:用 frp/ZeroTier/Cloudflare Tunnel 做内网穿透。内网穿透我之前写过详细的文章,不展开了。
七、全链路验证清单
| 步骤 | 操作 | 预期结果 |
|---|---|---|
| 1 | docker ps 确认 SRS 在运行 |
STATUS: Up |
| 2 | OBS 填 rtmp://localhost/live/ + 串流密钥 |
右下角绿色方块,码率跳动 |
| 3 | VLC 打开 rtmp://localhost/live/room001 |
画面出现,延迟 2~3s |
| 4 | 浏览器打开 .flv URL |
flv.js 播放,延迟 2~3s |
| 5 | 手机打开 .m3u8 URL |
原生播放器启动,延迟稍高 |
| 6 | FFmpeg RTSP 转推 | 摄像头画面出现在浏览器 |
六步全跑通,直播的全链路你就亲手搭完了。
本篇核心回顾
| 工具 | 角色 |
|---|---|
| SRS | 流媒体服务器,接收 RTMP,分发 HTTP-FLV / HLS |
| OBS | 推流软件,采集摄像头/桌面,推 RTMP 到 SRS |
| FFmpeg | 万能音视频工具,RTSP 转 RTMP 就靠它 |
| VLC | 拉流播放器,测 RTMP 流 |
| flv.js | 浏览器播 HTTP-FLV,B 站同款 |
| HLS (m3u8) | 移动端原生支持的流媒体协议 |
这个系列的五篇文章,从像素讲到编码,从协议讲到实战。如果你一篇一篇跟下来了,你现在对"视频到底是怎么从摄像头跑到观众屏幕上的"这个问题的理解,已经超过了 95% 的同行。
我是黒漂技术佬,这个音视频系列到这里暂告一段落。