SRS + FFmpeg WebRTC 循环推流环境搭建指南
本指南介绍如何使用 Docker Compose 快速搭建一个基于 SRS (Simple Realtime Server) 的流媒体测试环境。
- 推流协议:RTMP (FFmpeg 模拟推流)
- 拉流协议:WebRTC (低延迟播放)
- 特性:视频循环播放、不保存录制文件、支持静音音频填充、Docker 容器化。
1. 项目文件结构
在你的项目目录下,确保包含以下文件:
docker-compose.yml:定义容器服务。srs.conf:SRS 服务器配置。test.mp4:你的测试视频文件。
2. 配置文件详解
2.1 SRS 配置文件 (srs.conf)
此配置开启了 WebRTC 必需的 HTTP API 和 RTC 端口,并显式禁用了 DVR 和 HLS 以节省磁盘。
bash
# srs.conf
listen 1935;
max_connections 1000;
daemon off;
srs_log_tank console;
http_api {
enabled on;
listen 1985; # WebRTC 信令交换端口
}
http_server {
enabled on;
listen 8080; # 静态资源/控制台端口
}
rtc_server {
enabled on;
listen 8000; # UDP 媒体传输端口
# 注意:如果在局域网/公网访问,需将 127.0.0.1 改为宿主机实际 IP
candidate 127.0.0.1;
}
vhost __defaultVhost__ {
rtc {
enabled on;
rtc_to_rtmp on;
rtmp_to_rtc on;
}
# 确保不保存流文件
dvr { enabled off; }
hls { enabled off; }
}
2.2 Docker Compose 配置 (docker-compose.yml)
使用 Bridge 网络模式,通过端口映射暴露服务。FFmpeg 容器负责循环转码并推流。
yaml
services:
srs:
image: ossrs/srs:latest
container_name: srs_server
ports:
- "1935:1935" # RTMP
- "1985:1985" # HTTP API
- "8080:8080" # Console/Players
- "8000:8000/udp" # RTC UDP 传输
volumes:
- ./srs.conf:/usr/local/srs/conf/srs.conf
restart: always
ffmpeg:
image: jrottenberg/ffmpeg:latest
container_name: ffmpeg_pusher
depends_on:
- srs
volumes:
- .:/data
# 参数说明:
# -re: 按原帧率读取; -stream_loop -1: 无限循环
# anullsrc: 生成静音轨确保 WebRTC 音画同步
# -c:v libx264 -tune zerolatency: 针对实时流优化视频编码
# -c:a opus: WebRTC 标准音频格式
entrypoint: >
ffmpeg -re -stream_loop -1 -i /data/test.mp4
-f lavfi -i anullsrc=channel_layout=stereo:sample_rate=48000
-c:v libx264 -preset superfast -tune zerolatency
-c:a opus -strict -2
-map 0:v:0 -map 1:a:0
-f flv rtmp://srs:1935/live/test
restart: on-failure
3. 核心机制说明
3.1 为什么 WebRTC 需要 candidate?
WebRTC 建立连接时,服务器会通过 candidate 告诉浏览器:"来这个 IP 地址找我取数据"。
- 127.0.0.1:仅限在本机浏览器测试。
- 局域网 IP:允许同一 WiFi 下的其他设备观看。
3.2 FFmpeg 命令中的关键点
-tune zerolatency:禁用 B 帧,消除编解码缓冲区延迟。anullsrc:由于某些浏览器在没有音频轨道时无法启动 WebRTC 渲染,手动补齐静音轨可显著提高成功率。-map:显式指定第一个输入源取视频,第二个输入源(静音源)取音频。
4. 运行与验证
启动环境
bash
docker-compose up -d
验证步骤
- 检查推流状态 :查看
docker logs -f ffmpeg_pusher,确认没有报错。 - 访问控制台 :打开
http://localhost:8080/,在"视频流"中确认
5. 常见问题 (FAQ)
- 为什么 Clients 数始终为 1?
- FFmpeg 作为一个推流客户端始终连接在 SRS 上,所以即使没人观看,Client 数也至少为 1。
- 画面黑屏怎么排查?
- 检查浏览器控制台 (F12) 或
chrome://webrtc-internals/。 - 确认防火墙是否放行了
8000/udp端口。 - 确认视频编码是否为 H.264,音频是否为 Opus。
- 检查浏览器控制台 (F12) 或