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。

相关推荐
风哥2号13 小时前
数据库教程FGMT02‑生产环境Linux+Oracle19c安装配置与项目实战
linux·数据库·ffmpeg
Bruce_Liuxiaowei1 天前
录屏片段无损合并:从 ffmpeg concat 原理到 Python 自动化脚本
python·ffmpeg·自动化
工具派3 天前
口播视频怎么自动剪掉冷场?视频静音删除的阈值实测
ffmpeg·音视频·视频
❀͜͡傀儡师3 天前
移动端 360° 商品展示方案:从 20MB 雪碧图到 800KB 丝滑视频
ffmpeg·webgl·sprite
2501_930472443 天前
深度复盘|数据库迁移实战(上):腾讯云助手解析慢查询日志,定位索引缺失与语法不兼容
数据库·阿里云·ffmpeg·云计算·腾讯云·aws
平行云3 天前
国产GPU云渲染适配实战:驱动兼容、编码调优与多路并发
unity·ue5·webrtc·webgl·实时云渲染·云桌面·像素流送
我就是DaLing呀!3 天前
flutter + ffmpeg_kit_extended_flutter 大视频合并下载
flutter·ffmpeg·音视频
隐擎fox4 天前
网络传输安全剖析:WebRTC 本地真实 IP 泄漏机制(STUN/TURN)与 Python 防护检测实战
网络·网络协议·tcp/ip·安全·webrtc
可乐鸡翅yeah_5 天前
多浏览器 HLS 兼容性差异排查,Chrome、Firefox、Safari 表现不一致定位
chrome·ffmpeg·音视频·firefox·safari·m3u8
福大大架构师每日一题6 天前
mediamtx v1.21.0 发布:Media-over-QUIC、RTSP、HLS、WebRTC 与安全能力全面升级
安全·webrtc