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 以节省磁盘。

# 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       $CANDIDATE; 
}

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 容器负责循环转码并推流。

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
    environment:
      - CANDIDATE=192.168.43.150 # 宿主机真实id
    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. 运行与验证

启动环境

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。
  • 推流需要关键帧
    添加参数
    -g 50
    -keyint_min 50
    -sc_threshold 0

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐