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
之前可以更快地定位到指定时间点