使用 SRS 和 FFmpeg 快速搭建与优化直播推流

By | 2025-10-21

使用 SRS 和 FFmpeg 快速搭建与优化直播推流

在如今内容为王的时代,直播已经成为一种重要的互动形式。无论是游戏直播、在线教育还是个人分享,搭建一个高效稳定的推流服务器,并能从本地快速推流,是实现这一切的基础。本文将带你通过 SRS (Simple Realtime Server) 快速搭建推流服务器,并使用 FFmpeg 将本地摄像头画面推流至服务器,同时分享一些推流过程中可能遇到的问题及优化方案。

一、SRS:快速搭建你的直播推流服务器

SRS 是一个高性能、开源的流媒体服务器,支持 RTMP、HLS、WebRTC 等多种协议,以其易用性和强大的功能而闻名。最棒的是,它支持 Docker,可以让你在几分钟内启动一个功能完备的流媒体服务。

1.1 环境准备

确保你的服务器(本文以 Debian 12 为例)已安装 Docker 和 Docker Compose。

Debian 12 安装 Docker 步骤:

# 更新系统并安装依赖
sudo apt update
sudo apt install ca-certificates curl gnupg lsb-release -y

# 添加 Docker GPG 密钥
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

# 设置 Docker APT 仓库
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update

# 安装 Docker Engine
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y

# (可选) 非 root 用户运行 Docker,需要注销并重新登录
sudo usermod -aG docker $USER

1.2 启动 SRS 服务器

在服务器上,通过 Docker Compose 启动 SRS。这将自动配置 RTMP 推流和 HTTP-FLV/HLS 拉流。

# 1. 下载 docker-compose 配置文件
wget https://ossrs.net/lts/docker/docker-compose.yml

# 2. 启动 SRS 服务器 (确保 1935, 8080 端口未被占用)
docker compose up -d

1.3 访问 SRS Web UI

SRS 启动后,您可以通过浏览器访问其 Web UI 进行管理和查看状态。

  • 访问地址: http://[您的服务器IP]:8080
  • 确保开放端口: 如果您的服务器是云主机,请务必在云服务商的安全组和**服务器内部防火墙(如 UFW)**中开放 TCP 端口 1935 (RTMP)8080 (Web UI)

进入 Web UI 后,点击 “Stream Manager” 即可查看当前所有的推流状态。


二、使用 FFmpeg 从本地推流

FFmpeg 是一个功能强大的音视频处理工具,可以轻松将本地摄像头、麦克风内容实时推送到 SRS 服务器。

2.1 安装 FFmpeg (Windows)

如果您是 Windows 用户,请从 FFmpeg 官网下载其发布版本,并配置环境变量,使其能在命令行中直接运行。

2.2 识别您的摄像头和麦克风 (Windows)

在 Windows 上,FFmpeg 通过 DirectShow 接口访问设备。由于中文乱码问题,我们首先需要正确识别设备名称:

  1. 打开命令行(CMD 或 PowerShell),并临时将编码设置为 UTF-8 以避免乱码:
    chcp 65001
    
  2. 运行 FFmpeg 命令列出设备:
    ffmpeg -list_devices true -f dshow -i dummy
    
  3. 从输出中找到您的摄像头和麦克风的精确名称,例如:”Logi C270 HD WebCam” 和 “麦克风 (Logi C270 HD WebCam)”。

2.3 构建并执行推流命令

推流命令的结构包含输入源、视频编码、音频编码和输出目标。

推流命令示例:
我们将使用 [您的服务器IP] 作为示例。

# [您的服务器IP] 替换为您的实际服务器IP地址
ffmpeg -f dshow -i video="Logi C270 HD WebCam":audio="麦克风 (Logi C270 HD WebCam)" \
  -c:v libx264 -preset veryfast -tune zerolatency -b:v 1500k -g 60 -pix_fmt yuv420p \
  -c:a aac -b:a 128k \
  -f flv rtmp://[您的服务器IP]:1935/live/webcam

三、FFmpeg 推流常见问题与优化

在实际推流过程中,您可能会遇到 real-time buffer too fullframe droppedPast duration too large 等错误。这表明 FFmpeg 无法以足够快的速度捕获、编码和推流,导致缓冲区溢出和丢帧。

核心问题: 摄像头输入的数据量过大,或 CPU 编码速度跟不上。

优化方案: 调整 FFmpeg 推送参数,减轻压力。

3.1 强制限制摄像头输入(最有效)

-f dshow -i 之前 添加以下参数,强制摄像头捕获更小的画面和更低的帧率:

  • -framerate 15: 将帧率限制到 15 帧/秒。
  • -video_size 640x480: 将分辨率降到标清 (VGA),显著减少数据量。
  • -rtbufsize 30M: 增大 FFmpeg 内部实时缓冲区,给其更多处理时间。

优化后的命令示例:

# ⚠️ 注意参数顺序,必须在 -f dshow 之前
ffmpeg -framerate 15 -video_size 640x480 -rtbufsize 30M -f dshow -i video="Logi C270 HD WebCam":audio="麦克风 (Logi C270 HD WebCam)" \
  -c:v libx264 -preset veryfast -tune zerolatency -b:v 1500k -g 30 -pix_fmt yuv420p \
  -c:a aac -b:a 128k \
  -f flv rtmp://[您的服务器IP]:1935/live/webcam

3.2 进一步降低 CPU 编码压力

如果问题依然存在,说明您的 CPU 在 H.264 编码上仍有瓶颈。

  • -preset ultrafast: 将编码预设从 veryfast 切换到 ultrafast。这将牺牲一些画质,换取最快的编码速度和最低的 CPU 占用。

3.3 降低目标码率

如果网络上行带宽是瓶颈,即使 CPU 编码再快,数据也无法及时发送出去。

  • -b:v 800k: 尝试将视频码率从 1500k 降低到 800k1000k

最终推荐的强力优化命令:

# 针对低配机器和网络不佳环境的终极优化
ffmpeg -framerate 15 -video_size 640x480 -rtbufsize 30M -f dshow -i video="Logi C270 HD WebCam":audio="麦克风 (Logi C270 HD WebCam)" \
  -c:v libx264 -preset ultrafast -tune zerolatency -b:v 800k -g 30 -pix_fmt yuv420p \
  -c:a aac -b:a 128k \
  -f flv rtmp://[您的服务器IP]:1935/live/webcam

四、预览效果

登录srs控制台,查看推流情况并进行预览

image.png


总结

通过 SRS 和 FFmpeg,您可以快速搭建起一个个人或小团队的直播推流系统。在遇到推流不流畅、丢帧等问题时,请记住调整 FFmpeg 的输入参数、编码预设和目标码率,这些都是优化推流性能的关键。祝您的直播之旅顺利!