5月28日 01:59

如何用FFmpeg实现直播推流?需要哪些命令和参数?

FFmpeg 推流的核心就三步:指定输入源、设置编码参数、指向推流地址。掌握这几个环节的组合方式,就能应对绝大多数直播推流场景。

FFmpeg 推流的基本命令结构

一条完整的推流命令长这样:

bash
ffmpeg -i input.mp4 -c:v libx264 -preset fast -crf 23 -c:a aac -b:a 128k -f flv rtmp://server/live/stream

拆开来看:

  • -i:输入源,可以是本地文件、摄像头设备或网络流
  • -c:v / -c:a:视频/音频编码器,直播场景下视频常用 libx264,音频常用 aac
  • -f flv:输出封装格式,RTMP 推流必须用 FLV
  • 最后的 URL:推流地址,格式为 rtmp://服务器地址/应用名/流名

-re 参数在推本地文件时必须加,它让 FFmpeg 按原始帧率读取输入,否则会以最快速度推完。推摄像头或 RTSP 等实时源时不需要加。

视频编码参数怎么选?

编码器与预设

bash
-c:v libx264 -preset veryfast -tune zerolatency
  • -preset 控制编码速度与压缩率的平衡,从慢到快依次为 slowmediumfastveryfastultrafast。直播场景建议 veryfastultrafast,优先保证低延迟
  • -tune zerolatency 关闭前瞻分析,进一步降低延迟,互动直播必加

码率与质量控制

两种控制方式选其一:

方式一:CRF 恒定质量(适合带宽充足的场景)

bash
-crf 23 -maxrate 2500k -bufsize 5000k

CRF 值越低质量越高,直播推荐 18-28。配合 -maxrate-bufsize 设置上限,防止码率飙升导致卡顿。

方式二:CBR 恒定码率(适合带宽受限的场景)

bash
-b:v 1500k -maxrate 1500k -bufsize 3000k

码率固定,网络波动时更稳定。bufsize 通常设为 maxrate 的 2 倍。

分辨率与帧率

bash
-s 1280x720 -r 25 -g 50 -keyint_min 25
  • -g 设置 GOP 大小(关键帧间隔),建议等于帧率的 2 倍,方便客户端随时切入
  • -keyint_min 设置最小关键帧间隔,与 -g 保持一致可确保关键帧间隔均匀

音频编码参数怎么配?

bash
-c:a aac -b:a 128k -ar 44100 -ac 2
  • -b:a 128k:音频码率,语音直播 96k 足够,音乐直播建议 128-192k
  • -ar 44100:采样率,44100Hz 是标准值
  • -ac 2:双声道,单声道直播可设为 1

如果遇到音画不同步,加 -async 1 强制音频同步,或用 -vsync cfr 固定视频帧率。

常见推流场景的完整命令

本地文件推流到 RTMP 服务器

bash
ffmpeg -re -i input.mp4 -c:v libx264 -preset veryfast -crf 23 -maxrate 2500k -bufsize 5000k -c:a aac -b:a 128k -f flv rtmp://your-server.com/live/stream

关键点:-re 按原始帧率推流,-crf 23 平衡质量与码率。

摄像头实时推流(低延迟)

bash
ffmpeg -f v4l2 -i /dev/video0 -f alsa -i default -c:v libx264 -preset ultrafast -tune zerolatency -crf 28 -c:a aac -b:a 128k -f flv rtmp://server/live/low-latency

关键点:-f v4l2 捕获 Linux 摄像头,macOS 用 -f avfoundation -i "0",Windows 用 -f dshow -i video="摄像头名称"ultrafast + zerolatency 追求最低延迟。

循环推流(24小时轮播)

bash
ffmpeg -re -stream_loop -1 -i input.mp4 -c:v libx264 -preset fast -b:v 1500k -c:a aac -b:a 128k -f flv rtmp://server/live/loop

关键点:-stream_loop -1 无限循环,适合轮播场景。

RTSP 转 RTMP 推流

bash
ffmpeg -rtsp_transport tcp -i rtsp://camera-ip/stream -c:v libx264 -preset veryfast -b:v 2000k -c:a aac -b:a 128k -f flv rtmp://server/live/camera

关键点:-rtsp_transport tcp 用 TCP 拉取 RTSP 流,避免 UDP 丢包。如果 RTSP 源已经是 H.264 编码,可以用 -c:v copy 直接复制视频流,省去重编码开销。

SRT 协议推流

bash
ffmpeg -re -i input.mp4 -c:v libx264 -preset fast -b:v 2500k -c:a aac -b:a 128k -f mpegts 'srt://server:9000?streamid=live/stream'

关键点:SRT 在弱网环境下比 RTMP 更稳定,支持加密传输。输出格式用 mpegts 而非 flv

多路推流(同时推到多个平台)

bash
ffmpeg -re -i input.mp4 -c:v libx264 -preset fast -b:v 2000k -c:a aac -b:a 128k -f flv rtmp://platform-a.com/live/stream1 -c:v libx264 -preset fast -b:v 1500k -c:a aac -b:a 128k -f flv rtmp://platform-b.com/live/stream2

关键点:每个输出地址前指定独立的编码参数,可实现不同平台推不同画质。

硬件加速推流

CPU 编码吃满时可以用 GPU 加速:

bash
# NVIDIA GPU ffmpeg -hwaccel cuda -i input.mp4 -c:v h264_nvenc -preset p4 -b:v 2500k -c:a aac -b:a 128k -f flv rtmp://server/live/gpu # Intel GPU (VAAPI,Linux) ffmpeg -hwaccel vaapi -hwaccel_device /dev/dri/renderD128 -i input.mp4 -c:v h264_vaapi -b:v 2500k -c:a aac -b:a 128k -f flv rtmp://server/live/gpu # macOS (VideoToolbox) ffmpeg -hwaccel videotoolbox -i input.mp4 -c:v h264_videotoolbox -b:v 2500k -c:a aac -b:a 128k -f flv rtmp://server/live/gpu

硬件编码延迟更低、吞吐更高,但画质略逊于 libx264slow 预设。实际选择取决于业务优先级:画质选软编,性能选硬编。

推流常见问题排查

推流失败:Connection refused

检查 RTMP 服务器地址和端口是否正确,确认服务器防火墙放行了 1935 端口。用 telnet server 1935 快速验证网络连通性。

视频卡顿:帧率不稳或画面跳跃

  • 降低视频码率(-b:v 从 2500k 降到 1500k)
  • 增大缓冲区(-bufsize 设为 -maxrate 的 2-3 倍)
  • 换更快的编码预设(-preset ultrafast

音画不同步

  • -async 1 强制音频同步
  • -vsync cfr 固定视频帧率
  • 检查输入源本身是否同步(用 ffprobe 查看 PTS 信息)

推流延迟过高

  • -tune zerolatency 关闭前瞻
  • 减小 GOP 大小(-g 25
  • -preset ultrafast 加快编码
  • 考虑换 SRT 协议,弱网下延迟更低

推流过程中断流

加自动重连参数:

bash
ffmpeg -re -rtmp_live live -timeout 10000000 -i input.mp4 -c:v libx264 -preset fast -b:v 1500k -c:a aac -b:a 128k -f flv rtmp://server/live/stream

配合 shell 脚本实现断线自动重启:

bash
while true; do ffmpeg -re -i input.mp4 -c:v libx264 -preset fast -b:v 1500k -c:a aac -b:a 128k -f flv rtmp://server/live/stream sleep 2 done

推流参数速查表

场景编码预设码率CRFGOP特殊参数
互动直播ultrafast + zerolatency1500-2500k2850-tune zerolatency
高清直播fast3000-6000k2350-maxrate + -bufsize
弱网推流veryfast800-1500k2825SRT 协议
轮播推流fast1500-2500k2350-stream_loop -1
GPU 加速N/A (硬件编码)2500-4000kN/A50-hwaccel cuda/vaapi

实际推流时没有万能参数组合,需要根据网络带宽、服务器配置和画质要求调整。建议先在测试环境用 ffmpeg -loglevel verbose 跑一遍,观察实际码率和丢帧情况再上线。

标签:FFmpeg