频道 400 条视频的封面缩略图,我用 ffmpeg 批量压成 WebP
我自己的频道不算大,400 出头条视频。前阵子想把所有封面拉下来做个本地索引页,方便自己回顾哪类选题的点击率更高。结果第一批处理完就发现问题:封面图从后台拿到的 jpg,单张平均 180KB,400 张堆在一起 70MB 左右,塞进一个静态页面里,滚动时明显卡顿。
我的做法是先按视频 ID 批量拉缩略图,再用 ffmpeg 统一转 WebP。拉取用的是标准三档尺寸,这里只取 maxresdefault:
mkdir -p thumbs
while read vid; do
curl -sSL -o "thumbs/${vid}.jpg" \
"https://i.ytimg.com/vi/${vid}/maxresdefault.jpg"
done < video_ids.txt
转码这一步,参数我试了几轮才定下来:
for f in thumbs/*.jpg; do
ffmpeg -hide_banner -loglevel error -i "$f" \
-vf "scale='min(640,iw)':-2" \
-c:v libwebp -quality 78 -compression_level 6 \
"${f%.jpg}.webp"
done
关键在 scale='min(640,iw)':-2:宽度超过 640 就缩到 640,没超过就保持原宽,-2 保证高度是偶数。封面在索引页里最大显示宽度也就 320 左右,按 2 倍屏给到 640 够了。-quality 78 对封面这种有大色块和文字的图,肉眼看不出损失;再往下压到 70 以下,标题文字边缘会开始发糊。
代价说清楚:WebP 不是所有老浏览器都认,不过我的索引页只给自己看,无所谓。另外 compression_level 6 慢,400 张跑了大概两分多钟,能接受;如果换成几千张,这个参数值得降到 3 左右。
失效的地方我也踩到了。有些老视频没有 maxresdefault,curl 拿回来的是 404 页面的 HTML,ffmpeg 会直接报错退出。所以循环里要判断文件类型,或者干脆加 -f null 先探测一遍。另外,文件名里带视频 ID 没问题,但如果你按标题命名,记得先清理掉 / 和 :,我在一次重命名脚本里就因为这个把目录搞乱了。
最后体积从 70MB 降到 11MB 左右,页面滚动顺了,算是达到目的。不过我没有做去重,同一个封面被不同视频复用的情况没处理。
想问问有类似批量处理经验的:你们是按固定宽度缩放,还是按显示位置给不同尺寸各存一份?我现在的做法在平板竖屏下会有点糊,还没想好要不要补一档。
0 条评论
还没有评论,写下第一条。