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.mp4

2. 不转码重新封装

# 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.mp4

5. 修改帧率

# 转为 25 FPS
ffmpeg -i input.mp4 \
  -vf "fps=25" \
  output.mp4

6. 修改码率

# 视频码率 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.mp4

7. 截取视频

快速截取

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.mp4

8. 截图

# 第 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.jpg

9. 音频处理

# 提取 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.mp4

10. 音视频合并

ffmpeg \
  -i video.mp4 \
  -i audio.aac \
  -c:v copy \
  -c:a copy \
  output.mp4

11. 视频拼接

创建 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.mp4

17. 文件循环推 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/test

25 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.m3u8

20. 直播 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.ts

22. 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.ts

24. 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.mp4

26. 查看 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.mp4

macOS VideoToolbox

ffmpeg \
  -i input.mp4 \
  -c:v h264_videotoolbox \
  -b:v 4M \
  -c:a copy \
  output.mp4

Intel QSV

ffmpeg \
  -i input.mp4 \
  -c:v h264_qsv \
  -b:v 4M \
  -c:a copy \
  output.mp4

29. 查看 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-libsrt

30. 日志

只查看错误

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.log

31. HTTP/HLS 自动重连

ffmpeg \
  -reconnect 1 \
  -reconnect_streamed 1 \
  -reconnect_delay_max 5 \
  -i 'https://example.com/live/index.m3u8' \
  -c copy \
  output.ts

32. 网络超时

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 -i

36. 查看 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

标签: none

添加新评论