如何用FFmpeg的H.264编码实现类似Google Drive的视频压缩?
我有大量手机拍摄的视频,占用了大量存储空间。最近我发现,将视频上传至Google Drive后,用IDM下载(点击IDM检测到可下载内容时弹出的窗口),下载后的视频画质几乎不变,但占用空间大幅减少。经研究得知,Google采用H.264编码对上传视频重新编码,我认为可以用FFmpeg实现类似压缩效果。
我尝试了多种FFmpeg命令,却无法复刻Google Drive的压缩效果。仅使用-codec:v libx264参数时,输出视频体积比原文件还大。
调高-crf参数并选择更快的-preset选项虽能缩小文件体积,但会导致画质明显下降,还出现可见的视频伪影。
而Google Drive的处理能在保证画质清晰的同时实现理想的文件大小(注:放大视频时虽有轻微模糊,但在可接受范围内)。
我知道用H.265编码器替代H.264可能效果更好,但为保证公平性、避免偏差,我认为应先找到基于H.264编码器的最佳命令,之后再将-codec:v libx264替换为-codec:v libx265,确保所选命令是FFmpeg的最优方案,而非单纯依赖H.265的性能优势。
我目前使用的FFmpeg命令如下:
ffmpeg -hide_banner -loglevel verbose ^ -i input.mp4 ^ -codec:v libx264 ^ -crf 36 -preset ultrafast ^ -codec:a libopus -b:a 112k ^ -movflags use_metadata_tags+faststart -map_metadata 0 ^ output.mp4
| 视频文件 | 大小(字节) | 比特率(bps) | 编码器 | FFPROB - JSON |
|---|---|---|---|---|
| 原文件(名为'raw 1.mp4') | 31,666,777 | 10,314,710 | !!! | 原链接已移除 |
| 无crf参数 | 36,251,852 | 11,805,216 | Lavf60.3.100 | 原链接已移除 |
| 含crf参数 | 10,179,113 | 3,314,772 | Lavf60.3.100 | 原链接已移除 |
| Google Drive处理后 | 6,726,189 | 2,190,342 | 原链接已移除 |
上述文件可在指定文件夹中找到(原链接已移除)。
我继续用视频"raw_1.mp4"做实验,得到的结果与某博客文章中的结果相似(推荐参考某Super User回答)。
在实验图表中,我发现将-preset设为veryfast时效果最佳,能在压缩比与压缩时间间取得最优平衡(注:压缩率为负值表示处理后文件体积增大):
原动图链接已移除,内容为不同preset参数下压缩比与处理时间的对比曲线
在另一实验图表中,我使用H.264编码器,对比了7种不同-crf参数值(CRF值:25、27、29、31、33、35、37)对应的输出文件压缩比:
原图片链接已移除,内容为H.264编码器下不同CRF值对应的压缩比柱状图
在第三张实验图表中,我将编码器切换为H.265,使用与上一图相同的CRF值:
原图片链接已移除,内容为H.265编码器下不同CRF值对应的压缩比柱状图
基于这些结果,我目前偏好将FFmpeg的-preset设为veryfast、-crf设为31,除非被证明不是最优选择。对应的FFmpeg命令如下:
ffmpeg -hide_banner -loglevel verbose ^ -i input.mp4 ^ -codec:v libx264 ^ -crf 31 -preset veryfast ^ -codec:a libopus -b:a 112k ^ -movflags use_metadata_tags+faststart -map_metadata 0 ^ output.mp4
注:这些选择仅基于目前的压缩结果,未考虑输出文件的视觉质量。
内容的提问来源于stack exchange,提问作者Mycroft_47

