菜鸟科技网

ffmpeg推流命令参数怎么写?

ffmpeg 是一款强大的多媒体处理工具,其推流功能广泛应用于直播、视频监控、在线教育等场景,通过命令行参数的组合,ffmpeg 可以将本地视频文件、摄像头画面、桌面屏幕等实时推流到 RTMP、HLS、HTTP 等协议的服务器,本文将详细解析 ffmpeg 推流命令的核心参数、使用场景及注意事项,帮助用户快速掌握推流配置。

ffmpeg推流命令参数怎么写?-图1
(图片来源网络,侵删)

基础推流命令结构

ffmpeg 推流命令的基本结构通常分为三部分:输入源处理、编码参数、输出流配置,以推流本地视频文件到 RTMP 服务器为例,基础命令如下:

ffmpeg -re -i input.mp4 -c:v libx264 -preset veryfast -b:v 2000k -maxrate 2500k -bufsize 5000k -pix_fmt yuv420p -g 50 -c:a aac -b:a 128k -f flv rtmp://server/live/stream_key
  • -re:以文件原始帧率读取,避免因读取过快导致推流中断,适用于本地文件推流。
  • -i input.mp4:指定输入文件,可以是视频文件(如 .mp4、.avi)、摄像头设备(如 /dev/video0)或桌面屏幕(如 0.0)。
  • -c:v libx264:视频编码器选择,libx264 是 H.264 编码器,兼容性广泛;也可选 libx265(H.265)或 nvenc(NVIDIA 硬件加速)。
  • -preset veryfast:编码预设,影响编码速度和压缩效率,可选 ultrafastsuperfastfasterfastmedium 等,值越低速度越快,但码率控制稍弱。
  • -b:v 2000k:视频目标码率,单位为 kbps,根据网络带宽调整,如 1080P 推流建议 3000-5000k,720P 建议 1500-3000k。
  • -maxrate 2500k:视频最大码率,避免码率波动过高,通常为目标码率的 1.2-1.5 倍。
  • -bufsize 5000k:码率缓冲区大小,影响码率平滑度,一般为目标码率的 2-5 倍。
  • -pix_fmt yuv420p:像素格式,yuv420p 是最兼容的格式,大多数播放器支持。
  • -g 50:关键帧间隔,单位为帧数,建议 2- 秒一帧(如 25fps 帧率设 50,30fps 设 60)。
  • -c:a aac:音频编码器,aac 是主流音频编码器,兼容性好。
  • -b:a 128k:音频码率,单位 kbps,96-192k 即可满足需求。
  • -f flv:输出格式,flv 是 RTMP 推流的常用封装格式;若推流 HLS 服务器,则用 -f hls 并配合 -hls_time 4(每个切片时长)等参数。
  • rtmp://server/live/stream_key:RTMP 服务器地址,需替换为实际的服务器 URL 和推流密钥。

不同输入源的推流配置

摄像头推流

使用 USB 摄像头或网络摄像头推流,需通过 -i 指定设备路径(Linux 为 /dev/video0,Windows 为 video=1,macOS 为 0)。

ffmpeg -f v4l2 -i /dev/video0 -c:v libx264 -preset ultrafast -b:v 1500k -pix_fmt yuv420p -c:a aac -b:a 128k -f flv rtmp://server/live/camera_key
  • -f v4l2:指定输入格式为 V4L2(Linux 摄像头设备),Windows 需用 -f dshow,macOS 用 -f avfoundation

桌面屏幕推流

推流整个屏幕或指定区域,可通过 -i 结合 gdigrab(Windows)、x11grab(Linux)或 avfoundation(macOS),Linux 推流整个屏幕:

ffmpeg -f x11grab -i :0.0 -c:v libx264 -preset ultrafast -r 30 -b:v 3000k -pix_fmt yuv420p -c:a aac -b:a 128k -f flv rtmp://server/live/screen_key
  • -r 30:强制帧率为 30fps,屏幕推流建议 25-30fps 以保证流畅性。
  • 若推流指定区域(如从 1920,1080 开始,宽 1280、高 720),则 -i 参数改为 0.0+1920,1080 -video_size 1280x720

实时摄像头 + 麦克风推流

需同时处理视频和音频输入,并同步推流,Linux 环境下:

ffmpeg推流命令参数怎么写?-图2
(图片来源网络,侵删)
ffmpeg -f v4l2 -i /dev/video0 -f alsa -i default -c:v libx264 -preset ultrafast -b:v 1500k -pix_fmt yuv420p -c:a aac -b:a 128k -map 0:v:0 -map 1:a:0 -f flv rtmp://server/live/av_key
  • -f alsa -i default:指定音频输入为 ALSA 设备(Linux),Windows 用 -f dshow -i audio="麦克风",macOS 用 -f avfoundation -i ":0"
  • -map 0:v:0 -map 1:a:0:分别映射视频流(输入文件 0 的视频轨道 0)和音频流(输入文件 1 的音频轨道 0),避免多输入流混乱。

编码优化与网络适配

硬件加速编码

若使用 NVIDIA 显卡,可通过 nvenc 编码器降低 CPU 占用:

ffmpeg -i input.mp4 -c:v h264_nvenc -preset llhq -rc vbr_hq -qmin 20 -qmax 30 -b:v 2000k -maxrate 2500k -bufsize 5000k -c:a aac -b:a 128k -f flv rtmp://server/live/stream_key
  • -preset llhq:低延迟高质量预设,适合直播场景。
  • -rc vbr_hq:动态码率控制,平衡画质和带宽。

码率自适应推流

针对不同网络环境,可使用 -b:v 动态调整码率,或配合 -use_wallclock_as_timestamps 1 避免时间戳错乱,例如低码率推流(720P 1000k):

ffmpeg -re -i input.mp4 -c:v libx264 -preset veryfast -b:v 1000k -maxrate 1200k -bufsize 2500k -pix_fmt yuv420p -c:a aac -b:a 96k -f flv rtmp://server/live/low_key

推流 HLS(HTTP 直播流)

若需支持移动端或 CDN 分发,可推流至 HLS 服务器,命令如下:

ffmpeg -re -i input.mp4 -c:v libx264 -preset veryfast -b:v 2000k -maxrate 2500k -bufsize 5000k -pix_fmt yuv420p -g 50 -c:a aac -b:a 128k -hls_time 4 -hls_list_size 6 -f hls output.m3u8
  • -hls_time 4:每个 HLS 切片时长为 4 秒。
  • -hls_list_size 6:保留最近 6 个切片文件,避免磁盘占用过多。

常见问题与解决

推流卡顿或延迟

  • 原因:码率过高、网络带宽不足、编码速度慢。
  • 解决:降低 -b:v-maxrate 值,选择更快的 -preset(如 ultrafast),检查服务器上行带宽是否匹配推流码率。

播放器无法播放

  • 原因:编码参数不兼容(如像素格式非 yuv420p)、关键帧间隔过大、音频编码错误。
  • 解决:确保 -pix_fmt yuv420p,关键帧间隔 -g 不超过 2 秒帧数,音频编码器使用 aac 并检查码率是否合法(如 AAC 码率需为 64k、128k 等标准值)。

相关问答FAQs

Q1:如何推流 RTMP 同时保存本地副本?
A:使用 -c copy 直接复制流,避免重复编码,命令如下:

ffmpeg推流命令参数怎么写?-图3
(图片来源网络,侵删)
ffmpeg -re -i input.mp4 -c:v libx264 -preset veryfast -b:v 2000k -pix_fmt yuv420p -c:a aac -b:a 128k -f flv rtmp://server/live/stream_key -c copy output.mp4

注意:若需实时保存,建议使用 -segment-f segment 分片存储,避免单文件过大。

Q2:推流时如何添加水印?
A:通过 -vf 参数叠加水印图片或文字,例如添加图片水印:

ffmpeg -re -i input.mp4 -i watermark.png -filter_complex "[0:v][1:v]overlay=10:10" -c:v libx264 -preset veryfast -b:v 2000k -pix_fmt yuv420p -c:a aac -b:a 128k -f flv rtmp://server/live/stream_key
  • overlay=10:10 表示水印位于画面左上角(x=10, y=10),也可用 overlay=W-w-10:H-h-10 将水印放在右下角。
分享:
扫描分享到社交APP
上一篇
下一篇