多个大华摄像头Web播放完整方案(Docker+SRS+FFmpeg)
一、系统架构设计
- 前端采集:多路大华摄像头输出RTSP视频流
- 中间转换:每路摄像头独立FFmpeg进程将RTSP转为RTMP推送到SRS
- 后端分发:SRS服务器统一管理多路流,提供HLS/DASH/WebRTC等Web播放格式
- 终端播放:浏览器/VLC等客户端通过不同URL访问各摄像头视频
二、详细实施步骤
1. 获取多路大华摄像头RTSP地址
- 典型RTSP地址格式:
rtsp://用户名:密码@摄像头IP:554/Streaming/Channels/101
- 示例:
摄像头1:rtsp://admin:12345@192.168.1.100:554/Streaming/Channels/101 摄像头2:rtsp://admin:12345@192.168.1.101:554/Streaming/Channels/101
- 获取方法:
- 登录每个大华摄像头Web管理界面
- 进入"网络设置"或"RTSP设置"页面
- 复制RTSP地址(注意区分不同摄像头的IP和通道号)
2. Docker部署SRS服务器
docker run -d \
--name srs \
-p 1935:1935 \ # RTMP服务端口
-p 8080:8080 \ # SRS管理页面
-p 1985:1985 \ # SRS管理API
-p 8000:8000 \ # Web播放服务端口
ossrs/srs:5
- 验证:
- 访问管理页面:
http://服务器IP:8080
(默认账号admin/admin) - 查看日志:
docker logs srs
- 访问管理页面:
3. 多路FFmpeg推流配置
为每个摄像头创建独立的推流命令:
摄像头1推流:
ffmpeg -re \
-i "rtsp://admin:12345@192.168.1.100:554/Streaming/Channels/101" \
-c:v libx264 -preset veryfast -tune zerolatency \
-c:a aac \
-f flv \
rtmp://服务器IP/live/camera1 # 推流到SRS的RTMP地址(应用名为live,流名为camera1)
摄像头2推流:
ffmpeg -re \
-i "rtsp://admin:12345@192.168.1.101:554/Streaming/Channels/101" \
-c:v libx264 -preset veryfast -tune zerolatency \
-c:a aac \
-f flv \
rtmp://服务器IP/live/camera2 # 推流到SRS的RTMP地址(流名为camera2)
- 关键点:
- 每个摄像头使用独立的RTMP流名(如camera1、camera2)
- 可以使用脚本批量启动多个FFmpeg进程
4. Web播放配置
-
HLS播放(推荐):
摄像头1:http://服务器IP:8000/live/camera1.m3u8 摄像头2:http://服务器IP:8000/live/camera2.m3u8
- 直接在浏览器打开对应地址即可播放
- 或使用VLC播放器访问
-
DASH/WebRTC:
摄像头1:http://服务器IP:8000/live/camera1.mpd # DASH 摄像头2:http://服务器IP:8000/live/camera2 # WebRTC
三、多路管理优化方案
1. 使用脚本批量管理FFmpeg进程
创建start_streams.sh
脚本:
#!/bin/bash
# 启动摄像头1推流
ffmpeg -re -i "rtsp://admin:12345@192.168.1.100:554/Streaming/Channels/101" \
-c:v libx264 -preset veryfast -tune zerolatency \
-c:a aac \
-f flv \
rtmp://服务器IP/live/camera1 &
# 启动摄像头2推流
ffmpeg -re -i "rtsp://admin:12345@192.168.1.101:554/Streaming/Channels/101" \
-c:v libx264 -preset veryfast -tune zerolatency \
-c:a aac \
-f flv \
rtmp://服务器IP/live/camera2 &
echo "所有摄像头推流已启动"
运行脚本:
chmod +x start_streams.sh
./start_streams.sh
2. SRS配置优化(支持多路流)
docker exec -it srs bash
vi conf/srs.conf
关键配置示例:
http_remux {
enabled on;
mount [vhost]/[app]/[stream].flv;
}
hls {
enabled on;
hls_path ./objs/nginx/html;
hls_fragment 2; # 切片时长(秒)
hls_window 60; # 窗口大小(秒)
}
# 可以添加更多摄像头配置
重启SRS:
docker restart srs
四、常见问题排查
问题现象 | 可能原因 | 解决方法 |
---|---|---|
某路推流失败 | 对应摄像头RTSP地址错误 | 检查该摄像头的用户名/密码/IP/端口 |
某路Web无画面 | 对应流未成功推送到SRS | 检查SRS管理页面对应流状态 |
多路延迟大 | 编码参数未优化 | 统一使用-preset veryfast -tune zerolatency |
网络拥塞 | 多路视频带宽不足 | 调整视频码率(如-b:v 1024k ) |
五、生产环境建议
-
流命名规范:
- 使用有意义的流名(如
camera1
、camera2
) - 可以按区域/功能分组(如
east/camera1
)
- 使用有意义的流名(如
-
带宽管理:
- 控制每路视频码率(示例:
-b:v 1024k -b:a 128k
) - 使用QoS策略限制总带宽
- 控制每路视频码率(示例:
-
监控方案:
- 监控SRS日志:
docker logs -f srs
- 监控FFmpeg进程:
ps aux | grep ffmpeg
- 监控SRS日志:
-
安全措施:
- 修改SRS默认密码
- 限制RTMP推流地址的访问(可通过防火墙或SRS配置)
六、完整命令示例
- 启动多路推流:
# 摄像头1
ffmpeg -re -i "rtsp://admin:12345@192.168.1.100:554/Streaming/Channels/101" \
-c:v libx264 -preset veryfast -tune zerolatency \
-c:a aac -b:a 128k \
-b:v 1024k \
-f flv \
rtmp://服务器IP/live/camera1
# 摄像头2
ffmpeg -re -i "rtsp://admin:12345@192.168.1.101:554/Streaming/Channels/101" \
-c:v libx264 -preset veryfast -tune zerolatency \
-c:a aac -b:a 128k \
-b:v 1024k \
-f flv \
rtmp://服务器IP/live/camera2
- Web播放地址:
摄像头1:http://服务器IP:8000/live/camera1.m3u8
摄像头2:http://服务器IP:8000/live/camera2.m3u8
七、验证步骤
-
推流验证:
- 在SRS管理页面(
http://服务器IP:8080
)查看各流状态是否为active
- 在SRS管理页面(
-
播放验证:
- 浏览器分别访问各摄像头的HLS地址
- 或使用VLC播放器测试
按此方案实施后,即可实现多个大华摄像头的稳定Web实时播放!