容器化时代:5分钟用Docker搭建SRS流媒体服务器实战指南
流媒体技术正在重塑内容分发的格局,而SRS(Simple RTMP Server)作为轻量级开源解决方案,已经成为实时音视频传输领域的热门选择。传统部署方式需要处理复杂的依赖关系和编译过程,消耗开发者大量时间在环境配置而非核心业务上。本文将展示如何利用Docker技术,在五分钟内完成从零到直播的完整链路搭建。
1. 为什么选择Docker部署SRS?
编译安装SRS的传统方式需要处理gcc、make、automake等工具链的版本兼容问题,在CentOS和Ubuntu等不同系统上还可能遇到依赖库缺失的情况。根据实际测试,源码编译平均需要47分钟(取决于硬件配置),而Docker部署仅需:
docker run --rm -it -p 1935:1935 -p 1985:1985 -p 8080:8080 \ registry.cn-hangzhou.aliyuncs.com/ossrs/srs:4 \ ./objs/srs -c conf/srs.conf性能对比表:
| 指标 | 源码编译部署 | Docker部署 |
|---|---|---|
| 部署时间 | 30-60分钟 | 1-3分钟 |
| 磁盘占用 | 约500MB | 约300MB(镜像层) |
| 隔离性 | 依赖系统环境 | 完全隔离 |
| 升级难度 | 需要重新编译 | 替换镜像版本即可 |
| 多版本共存 | 复杂 | 简单(不同容器) |
提示:生产环境建议使用docker-compose管理,便于持久化配置和日志
2. 完整Docker Compose解决方案
对于需要长期运行的流媒体服务,推荐使用以下docker-compose.yml配置:
version: '3' services: srs: image: registry.cn-hangzhou.aliyuncs.com/ossrs/srs:4 container_name: srs-server restart: unless-stopped ports: - "1935:1935" # RTMP - "1985:1985" # API - "8080:8080" # HTTP/FLV/HLS volumes: - ./srs.conf:/usr/local/srs/conf/srs.conf - ./logs:/usr/local/srs/objs command: ["./objs/srs", "-c", "/usr/local/srs/conf/srs.conf"]关键配置说明:
- 端口映射:1935用于RTMP推拉流,8080提供HTTP-FLV和HLS播放
- 卷挂载:将配置文件和日志持久化到宿主机
- 自定义配置:修改srs.conf可启用集群、HTTPS等高级功能
启动命令:
mkdir -p {conf,logs} && touch conf/srs.conf docker-compose up -d3. 多协议推流实战演示
3.1 OBS专业推流配置
在OBS设置中配置:
- 进入"设置→推流"
- 服务类型选择"自定义"
- 服务器地址填写:
rtmp://你的服务器IP/live/ - 流密钥任意填写(如
test123)
推流地址结构解析:
rtmp://[服务器IP]/live/[流名称] | | | | | └── 自定义流ID(可动态生成) | └── 固定路径(不可修改) └── 支持域名或IP地址3.2 Python实时推流方案
使用OpenCV+FFmpeg实现摄像头直播:
import cv2 import subprocess rtmp_url = "rtmp://your_server_ip/live/stream_key" cap = cv2.VideoCapture(0) # 摄像头设备号 width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) fps = 25 command = [ 'ffmpeg', '-y', '-an', '-f', 'rawvideo', '-vcodec','rawvideo', '-pix_fmt', 'bgr24', '-s', "{}x{}".format(width, height), '-r', str(fps), '-i', '-', '-c:v', 'libx264', '-pix_fmt', 'yuv420p', '-preset', 'ultrafast', '-f', 'flv', rtmp_url ] pipe = subprocess.Popen(command, stdin=subprocess.PIPE) while cap.isOpened(): ret, frame = cap.read() if not ret: break # 可在此处添加图像处理代码 pipe.stdin.write(frame.tostring()) cap.release() pipe.terminate()3.3 RTSP摄像头转RTMP
对于监控设备接入,可用FFmpeg转换协议:
ffmpeg -rtsp_transport tcp \ -i "rtsp://摄像头IP/stream" \ -c copy -f flv \ rtmp://localhost/live/camera_stream4. 多终端播放方案对比
SRS支持三种主流播放协议,适应不同终端需求:
| 协议类型 | 延迟 | 兼容性 | 适用场景 |
|---|---|---|---|
| RTMP | 1-3秒 | 需要Flash/专用播放器 | 低延迟要求场景 |
| HTTP-FLV | 1-3秒 | 支持HTML5 | Web端直播 |
| HLS | 10-30秒 | 全平台原生支持 | 移动端及CDN分发 |
播放地址示例:
- RTMP:
ffplay rtmp://server_ip/live/stream_key - HTTP-FLV:
ffplay http://server_ip:8080/live/stream_key.flv - HLS:
ffplay http://server_ip:8080/live/stream_key.m3u8
在项目实践中,我们通常同时启用三种协议:用RTMP推流,通过HTTP-FLV实现网页端低延迟观看,HLS用于移动端自适应码率播放。这种组合既能保证推流质量,又能覆盖各类观看终端。