ffmpeg命令

ffmpeg 命令 #

ffmpeg是一个功能强大的跨平台命令行工具,用于处理音频、视频和其他多媒体文件与流。它可以用于转换格式、调整编解码器、修改分辨率、提取音频、合并文件等多种多媒体处理任务。

语法 #

ffmpeg [全局选项] {[输入文件选项] -i 输入文件} ... {[输出文件选项] 输出文件} ...

常用选项 #

全局选项 #

选项 描述
-y 覆盖输出文件而不询问
-n 不覆盖输出文件,如果存在则退出
-v 级别 设置日志级别(quiet, panic, fatal, error, warning, info, verbose, debug, trace)
-stats 显示编码进度
-progress URL 将进度信息发送到URL
-hide_banner 隐藏版权信息和构建选项
-h, --help 显示帮助信息

输入选项 #

选项 描述
-i 文件 指定输入文件
-f 格式 强制输入或输出文件格式
-ss 时间 设置开始时间(格式:HH:MM:SS.xxx)
-t 持续时间 设置录制持续时间
-to 时间 设置结束时间
-loop 次数 循环输入指定次数

输出选项 #

选项 描述
-c:v 编解码器 设置视频编解码器
-c:a 编解码器 设置音频编解码器
-c 编解码器 设置音频和视频编解码器
-vn 禁用视频
-an 禁用音频
-sn 禁用字幕
-b:v 比特率 设置视频比特率(如:1M, 5000k)
-b:a 比特率 设置音频比特率
-r 帧率 设置帧率(Hz值,分数或缩写)
-s 大小 设置帧大小(格式:WxH)
-aspect 比例 设置视频显示宽高比
-vf 过滤器 设置视频过滤器
-af 过滤器 设置音频过滤器
-preset 预设 设置编码预设(ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow)
-crf 值 设置恒定速率因子(0-51,0为无损)
-threads 数量 设置线程数
-map 流说明符 设置输入流到输出流的映射

常见用法 #

1. 格式转换 #

将MP4转换为MKV #

ffmpeg -i input.mp4 output.mkv

将MOV转换为MP4 #

ffmpeg -i input.mov output.mp4

将视频转换为GIF #

ffmpeg -i input.mp4 -vf "fps=10,scale=320:-1:flags=lanczos" output.gif

2. 视频压缩 #

使用H.264编码压缩视频 #

ffmpeg -i input.mp4 -c:v libx264 -crf 23 -preset medium -c:a aac -b:a 128k output.mp4

使用H.265/HEVC编码(更高压缩率) #

ffmpeg -i input.mp4 -c:v libx265 -crf 28 -preset medium -c:a aac -b:a 128k output.mp4

3. 调整视频分辨率 #

缩放到720p #

ffmpeg -i input.mp4 -vf "scale=1280:720" output.mp4

保持宽高比缩放 #

ffmpeg -i input.mp4 -vf "scale=1280:-1" output.mp4

4. 提取音频 #

从视频中提取音频 #

ffmpeg -i input.mp4 -vn -c:a copy output.aac

转换音频格式 #

ffmpeg -i input.mp3 output.ogg

5. 剪切视频 #

剪切指定时间段 #

ffmpeg -i input.mp4 -ss 00:01:30 -to 00:02:45 -c copy output.mp4

剪切指定长度 #

ffmpeg -i input.mp4 -ss 00:01:30 -t 00:01:15 -c copy output.mp4

6. 合并文件 #

使用concat协议合并相同编码的文件 #

首先创建一个文件列表:

echo "file 'input1.mp4'" > filelist.txt
echo "file 'input2.mp4'" >> filelist.txt

然后合并:

ffmpeg -f concat -safe 0 -i filelist.txt -c copy output.mp4

合并音频和视频 #

ffmpeg -i video.mp4 -i audio.mp3 -c:v copy -c:a aac -map 0:v:0 -map 1:a:0 output.mp4

7. 添加水印 #

添加图片水印 #

ffmpeg -i input.mp4 -i watermark.png -filter_complex "overlay=10:10" output.mp4

添加文字水印 #

ffmpeg -i input.mp4 -vf "drawtext=text='Copyright 2023':fontcolor=white:fontsize=24:x=10:y=10" output.mp4

8. 视频截图 #

截取单帧 #

ffmpeg -i input.mp4 -ss 00:01:23 -frames:v 1 screenshot.jpg

每隔一秒截取一帧 #

ffmpeg -i input.mp4 -vf "fps=1" screenshot_%03d.jpg

9. 视频旋转和翻转 #

顺时针旋转90度 #

ffmpeg -i input.mp4 -vf "transpose=1" output.mp4

水平翻转 #

ffmpeg -i input.mp4 -vf "hflip" output.mp4

10. 调整视频速度 #

加速视频(2倍速) #

ffmpeg -i input.mp4 -filter:v "setpts=0.5*PTS" output.mp4

减速视频(0.5倍速) #

ffmpeg -i input.mp4 -filter:v "setpts=2.0*PTS" output.mp4

高级用法 #

1. 视频流处理 #

从网络摄像头录制 #

ffmpeg -f v4l2 -i /dev/video0 -t 00:10:00 output.mp4

从屏幕录制 #

ffmpeg -f x11grab -s 1920x1080 -i :0.0 output.mp4

流媒体转发 #

ffmpeg -i rtmp://source.url -c copy -f flv rtmp://destination.url

2. 复杂过滤器 #

画中画效果 #

ffmpeg -i main.mp4 -i overlay.mp4 -filter_complex "[1:v]scale=300:-1[ovrl];[0:v][ovrl]overlay=W-w-10:H-h-10" output.mp4

视频拼接(网格) #

ffmpeg -i input1.mp4 -i input2.mp4 -i input3.mp4 -i input4.mp4 -filter_complex "nullsrc=size=640x480 [base]; [0:v] setpts=PTS-STARTPTS, scale=320x240 [upperleft]; [1:v] setpts=PTS-STARTPTS, scale=320x240 [upperright]; [2:v] setpts=PTS-STARTPTS, scale=320x240 [lowerleft]; [3:v] setpts=PTS-STARTPTS, scale=320x240 [lowerright]; [base][upperleft] overlay=shortest=1 [tmp1]; [tmp1][upperright] overlay=shortest=1:x=320 [tmp2]; [tmp2][lowerleft] overlay=shortest=1:y=240 [tmp3]; [tmp3][lowerright] overlay=shortest=1:x=320:y=240" output.mp4

3. 音频处理 #

调整音量 #

ffmpeg -i input.mp4 -af "volume=2.0" output.mp4

音频淡入淡出 #

ffmpeg -i input.mp4 -af "afade=t=in:st=0:d=5,afade=t=out:st=30:d=5" output.mp4

音频混音 #

ffmpeg -i video.mp4 -i audio.mp3 -filter_complex "[0:a][1:a]amix=inputs=2:duration=first:dropout_transition=2" -c:v copy output.mp4

4. 硬件加速 #

使用NVIDIA GPU加速(NVENC) #

ffmpeg -i input.mp4 -c:v h264_nvenc -preset slow -b:v 5M -c:a copy output.mp4

使用Intel QSV加速 #

ffmpeg -i input.mp4 -c:v h264_qsv -preset veryslow -b:v 5M -c:a copy output.mp4

使用AMD GPU加速(AMF) #

ffmpeg -i input.mp4 -c:v h264_amf -quality quality -b:v 5M -c:a copy output.mp4

常见编解码器 #

视频编解码器 #

编解码器 描述 常用选项
libx264 H.264/AVC编码器 -crf 23 -preset medium
libx265 H.265/HEVC编码器 -crf 28 -preset medium
libvpx-vp9 VP9编码器 -b:v 1M -crf 30
libaom-av1 AV1编码器 -crf 30 -cpu-used 8
mpeg4 MPEG-4编码器 -q:v 3
copy 不重新编码,直接复制

音频编解码器 #

编解码器 描述 常用选项
aac AAC编码器 -b:a 128k
libmp3lame MP3编码器 -b:a 192k
libopus Opus编码器 -b:a 96k
flac FLAC无损编码器
pcm_s16le 未压缩PCM
copy 不重新编码,直接复制

常见问题排查 #

1. 编解码器不可用 #

错误:Unknown encoder 'libx264'

解决方案:安装缺少的编解码器库

# Debian/Ubuntu
sudo apt install ffmpeg libavcodec-extra

# CentOS/RHEL
sudo dnf install ffmpeg-devel

2. 硬件加速不工作 #

确保已安装相应的驱动和库,并检查ffmpeg是否支持该硬件加速:

ffmpeg -encoders | grep -i nvenc  # 检查NVIDIA支持
ffmpeg -encoders | grep -i qsv    # 检查Intel QSV支持
ffmpeg -encoders | grep -i amf    # 检查AMD支持

3. 输出文件质量差 #

尝试调整CRF值(较低的值 = 更高的质量)和预设:

ffmpeg -i input.mp4 -c:v libx264 -crf 18 -preset slower -c:a copy output.mp4

4. 处理速度慢 #

  • 使用硬件加速
  • 选择更快的预设(如-preset veryfast
  • 减少输出分辨率
  • 增加线程数(-threads 8

提示 #

  • 使用-c copy可以在不重新编码的情况下更改容器格式,速度非常快
  • 使用-crf而不是-b:v可以获得更一致的视觉质量
  • 对于H.264,CRF值范围是0-51,18-28通常是合理的范围(较低 = 更高质量)
  • 使用-preset可以平衡编码速度和压缩效率
  • 使用ffprobe命令可以获取媒体文件的详细信息
  • 使用-hide_banner可以减少输出的冗余信息
  • 使用-map选项可以精确控制哪些流被包含在输出中
  • 对于批处理,可以结合shell脚本或循环使用ffmpeg
  • 使用-ss放在-i之前可以更快地定位到指定时间点