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。

相关推荐
小驴程序源1 天前
TS 分片合并完整教程
python·ffmpeg
RTC老炮3 天前
RaptorQ前向纠错算法架构分析
网络·算法·架构·webrtc
鬼蛟3 天前
Spring Cloud Alibaba
ffmpeg·bootstrap
米优3 天前
ffmpeg实现解码h264/h265裸码流
ffmpeg
好家伙VCC4 天前
**发散创新:基于FFmpeg的视频编码优化实践与实战代码解析**在现代多媒体系统中,
java·python·ffmpeg·音视频
许彰午4 天前
# 政务远程帮办:WebRTC视频通话+录屏录音+手工拼WAV实录
音视频·webrtc·政务
coder阿龙5 天前
基于PeerJS实现网页WebRTC屏幕分享
webrtc
我的世界洛天依5 天前
胡桃讲编程|混音教学系列① 第一步:音频素材怎么来?免费 + 简易方法全汇总
ffmpeg
RTC老炮5 天前
带宽估计算法(gcc++)架构设计及优化
网络·算法·webrtc
Soari6 天前
Ziggo-Device软件构建:ERRORS
网络·ffmpeg