FFmpeg 常用运维命令速查
FFmpeg 常用维护命令
1. 查看媒体信息
# 查看基本信息
ffmpeg -i input.mp4
# 查看完整格式和流信息
ffprobe -v error \
-show_format \
-show_streams \
input.mp4
# 查看视频编码
ffprobe -v error \
-select_streams v:0 \
-show_entries stream=codec_name \
-of default=noprint_wrappers=1:nokey=1 \
input.mp4
# 查看分辨率
ffprobe -v error \
-select_streams v:0 \
-show_entries stream=width,height \
-of csv=s=x:p=0 \
input.mp4
# 查看时长
ffprobe -v error \
-show_entries format=duration \
-of default=noprint_wrappers=1:nokey=1 \
input.mp42. 不转码重新封装
# MP4 -> TS
ffmpeg -i input.mp4 -c copy output.ts
# TS -> MP4
ffmpeg -i input.ts -c copy output.mp4
# MKV -> MP4
ffmpeg -i input.mkv -c copy output.mp4-c copy 表示不重新编码,只修改封装格式。
3. 视频转码
H.264 + AAC
ffmpeg -i input.mp4 \
-c:v libx264 \
-preset medium \
-crf 23 \
-c:a aac \
-b:a 128k \
output.mp4常用 CRF:
| CRF | 质量 |
|---|---|
| 18 | 高质量,文件较大 |
| 20 | 较高质量 |
| 23 | 默认推荐 |
| 25 | 较小文件 |
| 28 | 压缩明显 |
CRF 越小,画质越高,文件越大。
4. 修改分辨率
# 转 1080P
ffmpeg -i input.mp4 \
-vf "scale=-2:1080" \
-c:v libx264 \
-crf 23 \
-preset medium \
-c:a copy \
output_1080p.mp4
# 转 720P
ffmpeg -i input.mp4 \
-vf "scale=-2:720" \
-c:v libx264 \
-crf 23 \
-preset medium \
-c:a copy \
output_720p.mp45. 修改帧率
# 转为 25 FPS
ffmpeg -i input.mp4 \
-vf "fps=25" \
output.mp46. 修改码率
# 视频码率 2 Mbps
ffmpeg -i input.mp4 \
-c:v libx264 \
-b:v 2M \
-c:a aac \
-b:a 128k \
output.mp4直播场景建议增加 VBV:
ffmpeg -i input.mp4 \
-c:v libx264 \
-b:v 2M \
-maxrate 2M \
-bufsize 4M \
-c:a aac \
-b:a 128k \
output.mp47. 截取视频
快速截取
ffmpeg \
-ss 00:01:00 \
-i input.mp4 \
-t 30 \
-c copy \
output.mp4速度快,但截取位置可能受关键帧影响。
精确截取
ffmpeg \
-i input.mp4 \
-ss 00:01:00 \
-t 30 \
-c:v libx264 \
-c:a aac \
output.mp48. 截图
# 第 10 秒截图
ffmpeg \
-ss 00:00:10 \
-i input.mp4 \
-frames:v 1 \
screenshot.jpg
# 每 10 秒截图一次
ffmpeg \
-i input.mp4 \
-vf "fps=1/10" \
screenshot_%04d.jpg9. 音频处理
# 提取 AAC
ffmpeg \
-i input.mp4 \
-vn \
-c:a copy \
output.aac
# 转 MP3
ffmpeg \
-i input.mp4 \
-vn \
-c:a libmp3lame \
-b:a 192k \
output.mp3
# 去掉音频
ffmpeg \
-i input.mp4 \
-an \
-c:v copy \
output.mp410. 音视频合并
ffmpeg \
-i video.mp4 \
-i audio.aac \
-c:v copy \
-c:a copy \
output.mp411. 视频拼接
创建 filelist.txt:
file '1.mp4'
file '2.mp4'
file '3.mp4'执行:
ffmpeg \
-f concat \
-safe 0 \
-i filelist.txt \
-c copy \
output.mp4要求多个视频的编码参数基本一致。
12. 修复时间戳
# MP4
ffmpeg \
-fflags +genpts \
-i input.mp4 \
-c copy \
output.mp4
# TS
ffmpeg \
-fflags +genpts \
-i input.ts \
-c copy \
output.ts
# TS -> MP4
ffmpeg \
-fflags +genpts \
-i input.ts \
-c copy \
output.mp4常用于处理 PTS、DTS、时间戳异常。
13. MP4 FastStart
ffmpeg \
-i input.mp4 \
-c copy \
-movflags +faststart \
output.mp4将 moov atom 移动到文件头,更适合 Web 点播。
14. 检查媒体文件错误
# 只输出错误
ffmpeg \
-v error \
-i input.mp4 \
-f null -
# 输出 warning
ffmpeg \
-hide_banner \
-v warning \
-i input.ts \
-f null -如果第一条命令没有输出,通常说明没有明显的解码错误。
15. 检查直播流
RTMP
ffmpeg \
-i rtmp://example.com/live/test \
-t 10 \
-f null -HTTP-FLV
ffmpeg \
-i 'https://example.com/live/test.flv' \
-t 10 \
-f null -HLS
ffmpeg \
-i 'https://example.com/live/index.m3u8' \
-t 10 \
-f null -16. 拉流保存
# RTMP
ffmpeg \
-i rtmp://example.com/live/test \
-c copy \
output.flv
# HTTP-FLV
ffmpeg \
-i 'https://example.com/live/test.flv' \
-c copy \
output.flv
# HLS
ffmpeg \
-i 'https://example.com/live/index.m3u8' \
-c copy \
output.mp417. 文件循环推 RTMP
ffmpeg \
-re \
-stream_loop -1 \
-i input.mp4 \
-c copy \
-f flv \
rtmp://example.com/live/test-re 表示按照真实时间速度读取文件。
18. 转码推 RTMP
ffmpeg \
-re \
-i input.mp4 \
-c:v libx264 \
-preset veryfast \
-tune zerolatency \
-b:v 2000k \
-maxrate 2000k \
-bufsize 4000k \
-g 50 \
-c:a aac \
-b:a 128k \
-ar 48000 \
-f flv \
rtmp://example.com/live/test25 FPS 场景下,-g 50 表示大约 2 秒一个 GOP。
19. 生成 HLS
ffmpeg \
-i input.mp4 \
-c:v libx264 \
-c:a aac \
-hls_time 6 \
-hls_list_size 0 \
-hls_segment_filename 'segment_%05d.ts' \
output.m3u820. 直播 HLS 切片
ffmpeg \
-i rtmp://example.com/live/test \
-c copy \
-f hls \
-hls_time 2 \
-hls_list_size 5 \
-hls_flags delete_segments \
-hls_segment_filename '/data/hls/test_%05d.ts' \
/data/hls/test.m3u8参数说明:
-hls_time 2 每个分片约 2 秒
-hls_list_size 5 m3u8 保留最近 5 个分片
-hls_flags delete_segments
自动删除过期分片21. UDP 拉流
ffmpeg \
-i 'udp://239.0.0.1:1234?fifo_size=1000000&overrun_nonfatal=1' \
-c copy \
output.ts指定本地网卡:
ffmpeg \
-i 'udp://239.0.0.1:1234?localaddr=192.168.1.10&overrun_nonfatal=1&fifo_size=5000000' \
-c copy \
output.ts22. UDP 推流
ffmpeg \
-re \
-i input.mp4 \
-c copy \
-f mpegts \
'udp://239.0.0.1:1234?pkt_size=1316'1316 = 188 × 7,即一个 UDP 包携带 7 个 MPEG-TS Packet。
23. SRT 拉流
ffmpeg \
-i 'srt://1.2.3.4:9000?mode=caller&latency=200000' \
-c copy \
output.ts24. SRT 推流
ffmpeg \
-re \
-i input.mp4 \
-c copy \
-f mpegts \
'srt://1.2.3.4:9000?mode=caller&latency=200000'25. 查看关键帧
ffprobe \
-v error \
-select_streams v \
-show_frames \
-show_entries frame=pts_time,pict_type,key_frame \
-of csv \
input.mp4只查看关键帧:
ffprobe \
-v error \
-select_streams v \
-skip_frame nokey \
-show_frames \
-show_entries frame=pts_time,pict_type \
-of csv \
input.mp426. 查看 GOP
ffprobe \
-v error \
-select_streams v:0 \
-skip_frame nokey \
-show_entries frame=pts_time \
-of csv=p=0 \
input.mp4例如:
0.000000
2.000000
4.000000
6.000000说明 GOP 大约为 2 秒。
27. 测试解码性能
ffmpeg \
-benchmark \
-i input.mp4 \
-f null -只测试视频:
ffmpeg \
-benchmark \
-i input.mp4 \
-map 0:v:0 \
-f null -关注输出中的:
fps=
speed=例如:
speed=5.2x表示解码速度约为实时速度的 5.2 倍。
28. 硬件编码
NVIDIA NVENC
ffmpeg \
-i input.mp4 \
-c:v h264_nvenc \
-preset p4 \
-b:v 4M \
-c:a copy \
output.mp4macOS VideoToolbox
ffmpeg \
-i input.mp4 \
-c:v h264_videotoolbox \
-b:v 4M \
-c:a copy \
output.mp4Intel QSV
ffmpeg \
-i input.mp4 \
-c:v h264_qsv \
-b:v 4M \
-c:a copy \
output.mp429. 查看 FFmpeg 支持能力
# 查看版本和编译参数
ffmpeg -version
# 查看编码器
ffmpeg -encoders
# 查看 H.264 编码器
ffmpeg -encoders | grep 264
# 查看 HEVC 编码器
ffmpeg -encoders | grep -E '265|hevc'
# 查看解码器
ffmpeg -decoders
# 查看协议
ffmpeg -protocols
# 查看封装格式
ffmpeg -formats
# 查看滤镜
ffmpeg -filters排查 FFmpeg 是否支持某项功能时,重点查看:
ffmpeg -version例如:
--enable-libx264
--enable-libx265
--enable-libsrt30. 日志
只查看错误
ffmpeg \
-hide_banner \
-loglevel error \
-i input.mp4 \
-f null -Debug 日志
ffmpeg \
-hide_banner \
-loglevel debug \
-i input.mp4 \
-f null -保存日志
ffmpeg \
-hide_banner \
-loglevel info \
-i input.mp4 \
-f null - \
2> ffmpeg.log实时查看并保存
ffmpeg \
-hide_banner \
-loglevel info \
-i input.mp4 \
-f null - \
2>&1 | tee ffmpeg.log31. HTTP/HLS 自动重连
ffmpeg \
-reconnect 1 \
-reconnect_streamed 1 \
-reconnect_delay_max 5 \
-i 'https://example.com/live/index.m3u8' \
-c copy \
output.ts32. 网络超时
ffmpeg \
-rw_timeout 5000000 \
-i 'https://example.com/live/index.m3u8' \
-f null -rw_timeout 单位为微秒:
5000000 = 5 秒33. 后台运行
nohup ffmpeg \
-i input.mp4 \
-c copy \
output.mp4 \
> ffmpeg.log 2>&1 &34. 查看 FFmpeg 进程
# 推荐
pgrep -af ffmpeg
# 查看 CPU、内存、运行时间
ps -C ffmpeg \
-o pid,ppid,%cpu,%mem,etime,args
# 每秒刷新
watch -n 1 \
'ps -C ffmpeg -o pid,ppid,%cpu,%mem,etime,args'35. 查看网络连接
ss -ntup | grep ffmpeg
lsof -i -P -n | grep ffmpeg查看指定 PID:
lsof -p 12345 -i36. 查看 FFmpeg 打开的文件
lsof -p 12345只看媒体文件:
lsof -p 12345 | grep -E '\.(mp4|flv|ts|m3u8)'37. 停止 FFmpeg
推荐优雅停止:
kill -INT 12345普通停止:
kill 12345强制杀死:
kill -9 12345录制 MP4、HLS 切片、文件写入场景尽量避免直接使用 kill -9。
38. 最常用命令速查
# 查看媒体信息
ffprobe input.mp4
# 查看完整流信息
ffprobe -v error -show_format -show_streams input.mp4
# 检查媒体错误
ffmpeg -v error -i input.mp4 -f null -
# TS -> MP4
ffmpeg -i input.ts -c copy output.mp4
# 修复时间戳
ffmpeg -fflags +genpts -i input.ts -c copy output.mp4
# MP4 FastStart
ffmpeg -i input.mp4 -c copy -movflags +faststart output.mp4
# 检查 HLS
ffmpeg -i 'https://example.com/live/test.m3u8' -t 10 -f null -
# 查看关键帧
ffprobe \
-v error \
-select_streams v \
-skip_frame nokey \
-show_frames \
-show_entries frame=pts_time,pict_type \
-of csv \
input.mp4
# 查看 FFmpeg 进程
pgrep -af ffmpeg
# 优雅停止
kill -INT PID