使用 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 接口访问设备。由于中文乱码问题,我们首先需要正确识别设备名称:
- 打开命令行(CMD 或 PowerShell),并临时将编码设置为 UTF-8 以避免乱码:
chcp 65001
- 运行 FFmpeg 命令列出设备:
ffmpeg -list_devices true -f dshow -i dummy
- 从输出中找到您的摄像头和麦克风的精确名称,例如:”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 full
、frame dropped
、Past 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
降低到800k
或1000k
。
最终推荐的强力优化命令:
# 针对低配机器和网络不佳环境的终极优化
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控制台,查看推流情况并进行预览
总结
通过 SRS 和 FFmpeg,您可以快速搭建起一个个人或小团队的直播推流系统。在遇到推流不流畅、丢帧等问题时,请记住调整 FFmpeg 的输入参数、编码预设和目标码率,这些都是优化推流性能的关键。祝您的直播之旅顺利!