我在 HP Compaq 8000 Elite CMT PC 上运行 Debian GNU/Linux 11 (bullseye) x86_64,它有一个旧的 CPU(Intel Core 2 Duo E8400 (2) @ 3.000GHz)和一个不支持视频编码的 GPU(GeForce GT 730),所以甚至不要考虑我有 GPU 这一事实。
我有 109 张 5184*3888px 的 JPEG 图片,我想在 FFmpeg 中缩小它们。运行此命令导致我的计算机完全崩溃:
ffmpeg -i *.JPG -vf scale=1296:972 *.JPG
我无法移动鼠标,无法退出程序,什么都做不了。在我确认要覆盖同名文件后,发生了这种情况。
由于我重启电脑后发现文件没有改变,所以我假设 FFmpeg 在停止前没有输出任何内容。我尝试过几次该过程,但每次电脑都死机了。
我该如何告诉 FFmpeg“慢慢来”而不是填满我的 CPU,你能估计一下我应该使用什么设置才能获得最佳性能吗?
答案1
使用 ImageMagic 而不是 FFmpeg。
为什么要使用 FFmpeg 来处理图像?您正在使用主要用于处理视频的工具来处理静态图像。
是的,我知道 FFmpeg 可以完成您想要做的事情,但这不是很多人在这种情况下会使用的工具。
只需安装图像魔术师并运行此命令:
find -E * - maxdepth 1 -type f -iregex '.*\.(JPG|JPEG|PNG|PSD|TIF|TIFF|HEIC)$' |\
while read FULL_IMAGE_PATH
do
convert -density 72 -units PixelsPerInch -resize "1296x972>" -quality 100 "${FULL_IMAGE_PATH}" "${FULL_IMAGE_PATH}";
done
find
这是我用于调整图像大小的基本脚本,效果非常好!
如果此脚本仍然阻塞你的系统,请使用sleep
暂停命令的每次循环。这是上述命令的修改版本,在每个循环之间添加一个简单的 1 秒暂停。
find -E * - maxdepth 1 -type f -iregex '.*\.(JPG|JPEG|PNG|PSD|TIF|TIFF|HEIC)$' |\
while read FULL_IMAGE_PATH
do
convert -density 72 -units PixelsPerInch -resize "1296x972>" -quality 100 "${FULL_IMAGE_PATH}" "${FULL_IMAGE_PATH}";
sleep 1;
done
或者,如果这些东西看起来使用起来很复杂 — — 在我看来,它只是更加健壮和灵活 — — 你可以使用for
你正在使用的循环的这个变体,但是使用 ImageMagick 来代替,如下所示:
for i in *.JPG;
do
convert -density 72 -units PixelsPerInch -resize "1296x972>" -quality 100 "$i" "$i"-scaled.jpg;
done
答案2
解决此问题的一种方法是使用简单的单行 Bash for 循环,如下所示:
for i in *.JPG; do ffmpeg -i "$i" -vf scale=1296:972 "$i"-scaled.jpg; done
该for i in *.JPG;
部分可以翻译成英文为:“对于所有以'.JPG'结尾的文件(顺便说一下,将名称的其余部分分配给变量我)。”可以do ffmpeg -i "$i"
翻译为:“执行以下操作:调用 ffmpeg 并输入所有名称与以下内容相对应的文件我的值,即所有以 .JPG 结尾的文件。”该-vf scale=1296:972
部分翻译为:“应用‘scale’视频滤镜,使用尺寸 1296 x 972(默认情况下以像素为单位)。”该"$i"-scaled.jpg
部分翻译为“所有输出的文件都应以其原始名称命名,后跟字符串‘-scaled.jpg’。”最后一部分,done
不应该省略,因为这是结束 for 循环的部分,导致终止执行 Bash 命令。