这篇是旧 FFmpeg 笔记的整理版。原文里有一些 HTML 表格代码块,这里改成标准 Markdown 代码块,方便复制和阅读。
Table of contents
Open Table of contents
合并一个文件夹内的所有视频
如果多个 MP4 编码一致,可以用 concat 方式无损合并。
find *.mp4 | sed 's:\ :\\\ :g' | sed 's/^/file /' > fl.txt
ffmpeg -f concat -i fl.txt -c copy output.mp4
rm fl.txt
如果路径或文件名比较复杂,可以加 -safe 0:
find *.mp4 | sed 's:\ :\\\ :g' | sed 's/^/file /' > fl.txt
ffmpeg -safe 0 -f concat -i fl.txt -c copy output.mp4
rm fl.txt
参考:
How can I merge all the videos in a folder?
视频压缩:H.264 与 H.265
H.264 兼容性最好:
ffmpeg -i input.mp4 -c:v libx264 -crf 23 -c:a aac output.mp4
H.265 体积更小,但兼容性略差:
ffmpeg -i input.mp4 -c:v libx265 -crf 28 -c:a aac output.mp4
如果希望在 Apple 设备上更好识别 H.265,可以加 -vtag hvc1:
ffmpeg -i input.mp4 -c:v libx265 -crf 28 -vtag hvc1 -c:a copy output_hevc.mp4
CRF 可以粗略理解为质量参数:
| CRF | 效果 |
|---|---|
| 数值越小 | 质量越高,文件越大 |
| 数值越大 | 文件越小,画质越差 |
常用范围:
- H.264:
18-28 - H.265:
24-32 - VP9:
28-36
参考:
使用 NVIDIA 硬件编码
软件编码质量好,但速度慢。如果机器有 NVIDIA 显卡,可以用 NVENC。
H.264 硬件编码:
ffmpeg -i input.mp4 -c:v h264_nvenc -cq 23 -c:a aac output.mp4
H.265 硬件编码:
ffmpeg -i input.mp4 -c:v hevc_nvenc -cq 28 -c:a aac output.mp4
旧笔记里有一个实际结果:将视频从 H.264 转码到 H.265,体积从 3.8GB 降到 430MB,耗时约 55 分钟。
ffmpeg -i 1.mp4 -c:v libx265 -vtag hvc1 -c:a copy 1_hevc.mp4
按时间裁剪视频
使用原编码快速裁剪:
ffmpeg -ss 00:05 -to 08:53.500 -i input.mp4 -c copy output.mp4
另一个例子:
ffmpeg -ss 07:18 -to 13:45 -i aaa.mkv -c copy bbb.mkv
参数说明:
-ss:开始时间-to:结束时间-i:输入文件-c copy:不重新编码,速度快
如果裁剪点不准,可以把 -ss 放到 -i 后面,精度更高,但速度可能更慢:
ffmpeg -i input.mp4 -ss 00:05 -to 08:53.500 -c copy output.mp4
合并视频和音频
视频保留原始编码,音频转为 AAC:
ffmpeg -i 1.mp4 -i 1.opus -c:v copy -c:a aac output.mp4
如果音频也能直接兼容,可以尝试:
ffmpeg -i 1.mp4 -i 1.m4a -c copy output.mp4
图片格式转换和缩放
PNG 转 JPG:
ffmpeg -i image.png -preset ultrafast image.jpg
修改图片尺寸:
ffmpeg -i image.jpeg -vf scale=413:626 2寸.jpeg
ffmpeg -i image.jpeg -vf scale=390:567 1寸.jpeg
如果只指定宽度,让高度等比例:
ffmpeg -i image.jpeg -vf scale=1200:-1 output.jpeg
音频重复
将一个音频重复 10 次:
ffmpeg -stream_loop 10 -i input.m4a -c copy output.m4a
注意 -stream_loop 10 表示额外循环 10 次,不是总共播放 10 次。
Windows 上安装 FFmpeg
旧笔记里使用 scoop:
scoop install ffmpeg
更新 scoop 安装的所有程序:
scoop list | foreach { scoop update $_.Name }
小结
我最常用的 FFmpeg 命令可以归为四类:
- 合并:
concat + -c copy - 压缩:
libx264/libx265 + crf - 裁剪:
-ss + -to + -c copy - 硬件加速:
h264_nvenc/hevc_nvenc
如果目标是“快”,优先 -c copy 或 NVENC。如果目标是“体积小且画质可控”,优先软件编码加 CRF。