如何用FFmpeg实现直播推流?需要哪些命令和参数?
FFmpeg 推流的核心就三步:指定输入源、设置编码参数、指向推流地址。掌握这几个环节的组合方式,就能应对绝大多数直播推流场景。
FFmpeg 推流的基本命令结构
一条完整的推流命令长这样:
bashffmpeg -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控制编码速度与压缩率的平衡,从慢到快依次为slow→medium→fast→veryfast→ultrafast。直播场景建议veryfast或ultrafast,优先保证低延迟-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 服务器
bashffmpeg -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 平衡质量与码率。
摄像头实时推流(低延迟)
bashffmpeg -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小时轮播)
bashffmpeg -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 推流
bashffmpeg -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 协议推流
bashffmpeg -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。
多路推流(同时推到多个平台)
bashffmpeg -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
硬件编码延迟更低、吞吐更高,但画质略逊于 libx264 的 slow 预设。实际选择取决于业务优先级:画质选软编,性能选硬编。
推流常见问题排查
推流失败: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 协议,弱网下延迟更低
推流过程中断流
加自动重连参数:
bashffmpeg -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 脚本实现断线自动重启:
bashwhile 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
推流参数速查表
| 场景 | 编码预设 | 码率 | CRF | GOP | 特殊参数 |
|---|---|---|---|---|---|
| 互动直播 | ultrafast + zerolatency | 1500-2500k | 28 | 50 | -tune zerolatency |
| 高清直播 | fast | 3000-6000k | 23 | 50 | -maxrate + -bufsize |
| 弱网推流 | veryfast | 800-1500k | 28 | 25 | SRT 协议 |
| 轮播推流 | fast | 1500-2500k | 23 | 50 | -stream_loop -1 |
| GPU 加速 | N/A (硬件编码) | 2500-4000k | N/A | 50 | -hwaccel cuda/vaapi |
实际推流时没有万能参数组合,需要根据网络带宽、服务器配置和画质要求调整。建议先在测试环境用 ffmpeg -loglevel verbose 跑一遍,观察实际码率和丢帧情况再上线。