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。

相关推荐
小何开发8 小时前
ffmpeg 安装与使用: 将视频分片与组装
ffmpeg·音视频
道剑剑非道1 天前
FFmpeg + Qt 实现摄像头采集与 MP3 背景音乐 RTSP 推流
开发语言·qt·ffmpeg
道剑剑非道2 天前
FFmpeg 6.0 实战:用 C++ 封装摄像头采集与 RTSP 推流
开发语言·c++·ffmpeg
Gc9umsbL12 天前
从FLAC到WAV:whisper.cpp中的FFmpeg音频预处理全解析
ffmpeg·whisper·音视频
angushine2 天前
ffmpeg+nginx搭建HLS 推流
运维·nginx·ffmpeg
HySpark2 天前
VAD 与流式 ASR 踩坑复盘及完整解决方案
webrtc·vad·离线语音转写·流式asr·qwen-asr·音频预处理
徐子元竟然被占了!!2 天前
WebRTC协议
webrtc
ZC跨境爬虫2 天前
跟着 MDN 学 HTML day_28:(使用选择器 API 在 DOM 树中进行选择与遍历)
前端·ui·html·音视频·webrtc
EasyGBS3 天前
国标GB28181视频平台EasyGBS解决多格式视频流无缝转换难题
ffmpeg·音视频
树下水月4 天前
关于使用ffmpeg的一些使用方法
ffmpeg