ffmpeg -i in.mp4 -c:v libx264 -crf 28 -preset fast out.mp4 可以把视频压缩成 MP4,用少量画质换来小得多的文件——CRF 就是这个旋钮,18–28 是唯一需要记住的区间。接下来会讲清楚 CRF 的具体数值、如何一次性批量转换整个文件夹,以及大多数教程都会跳过的一步:在跑一个小时的转码之前,先看清楚文件的时长和编码方式。
1. 文件里到底有什么
$ clai 显示这个视频的时长→ ffprobe -v error -show_entries format=duration -of csv=p=0 in.mp42.000000
ffprobe 随 ffmpeg 一起安装,不会做任何转码。在开始一次可能要跑一个小时的转换之前,先看看你面对的到底是什么。
2. 压缩视频,同时控制画质
$ clai 压缩这个视频,质量比体积更重要→ ffmpeg -i in.mp4 -c:v libx264 -crf 28 -preset fast out.mp4
在测试片段上,源文件是 13074 字节,输出是 10861 字节。CRF 是一个 0 到 51 的画质刻度,数值越小画质越好、文件也越大。值得记住的区间是 18–28:18 与原片肉眼几乎看不出差别,23 是比较稳妥的默认值,28 明显更软一些,但大多数场景都够用。
3. 压缩不够时,进一步降低分辨率
$ clai 再压缩狠一点,把高度缩小到 144 像素→ ffmpeg -i in.mp4 -vf "scale=-2:144" -crf 30 small.mp4
同一个片段,现在是 8130 字节,对比原来的 13074 字节。宽度里的 -2 意思是「自己算,保持宽高比,并且凑成偶数」——编码器要求尺寸是偶数,网上一半的 ffmpeg 单行命令都栽在这一点上。
4. 换个容器,内容不动
$ clai 把这个视频从 mov 转成 mp4,不要重新编码→ ffmpeg -i input.mov -c copy output.mp4
-c copy 原样复制码流。只要几秒钟而不是几分钟,也不会损失画质——前提是里面的编码格式和新容器兼容,mov 转 mp4 通常没问题。
5. 批量处理整个文件夹
$ clai 把这个文件夹里所有 mov 都转成 mp4,文件名保持不变→ for f in *.mov; do ffmpeg -i "$f" -c:v libx264 -crf 23 "${f%.mov}.mp4"; done
${f%.mov} 去掉扩展名。$f 外面的引号不是可有可无的——少了它们,文件名里第一个带空格的文件就会打断循环。
6. 不重新编码地剪出一段
$ clai 剪出一段从第 30 秒开始、长一分钟的片段→ ffmpeg -ss 30 -i input.mp4 -t 60 -c copy clip.mp4
-ss 放在 -i 前面速度很快,因为 ffmpeg 是在跳转而不是解码。配合 -c copy,剪切点会落在最近的关键帧上,所以起始位置可能会偏移最多一秒。需要精确到帧的话,去掉 -c copy,用重新编码换精度。
常见坑
-preset改变的是速度,不是画质。ultrafast编码快但文件更大,slow相反。在同一个 CRF 下,它对画质的影响很小——本质上是用时间换文件大小。- 音频会被悄悄重新编码。 如果你没提到
-c:a,ffmpeg 会自己决定怎么处理。不想动音频时加上-c:a copy。 - CRF 在不同编码器之间不是同一个意思。 对 libx265 来说,同样的数字画质更高:x265 的 CRF 28 大致相当于 x264 的 CRF 23。
相关问题
该选哪个 CRF? 从 23 开始。文件太大就用 28。要长期保存、不能降质的就用 18。
ffmpeg 比在线转换工具好在哪? 视频不会离开你的电脑,没有文件大小限制,一条命令就能处理整个文件夹。
怎么加快编码速度? 用硬件编码器:NVIDIA 上用 -c:v h264_nvenc,macOS 上用 -c:v h264_videotoolbox。速度快很多,同码率下画质会稍差一点。
相关阅读
描述你想要的效果,CliAI 会帮你写好 ffmpeg 参数,CRF 和缩放滤镜都不例外。一行命令安装。