流媒体实战(五):Docker 一键部署 SRS 直播服务器,OBS 推流、手机拉流

流媒体实战(五):Docker 一键部署 SRS 直播服务器,OBS 推流、手机拉流

前四篇把理论讲完了。这一篇就是动手------从零搭一套直播系统:服务器用 SRS,推流用 OBS,观众用手机浏览器看 HLS。一条命令启动,五分钟跑通全链路。

大家好,我是黒漂技术佬。

理论讲再多,不如亲手跑一遍。今天的目标很明确:

  1. 用 Docker 启动一个 SRS 流媒体服务器。
  2. 用 OBS 推一路 RTMP 视频流到服务器。
  3. 用手机浏览器播放 HLS 流,或用 VLC 播 RTMP/HTTP-FLV。
  4. 如果需要,再加一路 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 Studioobsproject.com)是开源免费的推流软件,主播都在用。

3.1 OBS 设置

  1. 打开 OBS → 右下角「设置」→「直播」。
  2. 服务选「自定义」。
  3. 服务器填:rtmp://localhost/live/
  4. 串流密钥填: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% 的同行。

我是黒漂技术佬,这个音视频系列到这里暂告一段落。