SRS + FFmpeg WebRTC 循环推流环境搭建

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

验证步骤

  1. 检查推流状态 :查看 docker logs -f ffmpeg_pusher,确认没有报错。
  2. 访问控制台 :打开 http://localhost:8080/,在"视频流"中确认

5. 常见问题 (FAQ)

  • 为什么 Clients 数始终为 1?
    • FFmpeg 作为一个推流客户端始终连接在 SRS 上,所以即使没人观看,Client 数也至少为 1。
  • 画面黑屏怎么排查?
    • 检查浏览器控制台 (F12) 或 chrome://webrtc-internals/
    • 确认防火墙是否放行了 8000/udp 端口。
    • 确认视频编码是否为 H.264,音频是否为 Opus。

相关推荐
破阵子443284 小时前
从零开始:Windows 系统下 FFmpeg 安装与使用完全指南
windows·ffmpeg
EasyDSS4 小时前
EasyDSS校园数字化WebRTC私有化部署企业级融媒体系统设计方案解析
webrtc·媒体·ai大模型·m3u8·语音转写·点播技术
要开心吖ZSH1 天前
MP4 转 WAV 音频转码方案详解(ProcessBuilder + FFmpeg)
java·ffmpeg·音视频
要开心吖ZSH1 天前
MP4 转 WAV 音频转码方案详解(互联网医院病历AI实战-JAVE2方案)
java·ffmpeg
RTC老炮1 天前
webrtc弱网-BBRv2算法原理
网络·算法·webrtc
RTC老炮1 天前
webrtc弱网-BBRv1算法原理
网络·算法·webrtc
爱学习的程序媛3 天前
Windows系统下安装与配置FreeSWITCH完整指南
windows·实时互动·webrtc·实时音视频·信息与通信·媒体
火山上的企鹅3 天前
QGC二次开发本地媒体浏览实战(二)FFmpeg最小系统实战
qt·ffmpeg·媒体·qgc
xiejiashu3 天前
EasyRTC成功发布!原生WebRTC/嵌入式WebRTC,Windows/Linux/Android/ARM全支持
webrtc·嵌入式webrtc·easyrtc·webrtc原生库·arm-webrtc