Как улучшить производительность FFmpeg в старой настройке при масштабировании изображений
Я использую Debian GNU/Linux 11 (яблочко) x86_64 на ПК HP Compaq 8000 Elite CMT, у него старый процессор (Intel Core 2 Duo E8400 (2) @ 3000 ГГц) и графический процессор (GeForce GT 730), который не работает. Я не поддерживаю кодирование видео, поэтому даже не учитывайте тот факт, что у меня есть графический процессор.
У меня есть сто девять изображений JPEG размером 5184*3888 пикселей, которые я хочу уменьшить в FFmpeg. Выполнение этой команды приводит к полной ошибке моего компьютера:
ffmpeg -i *.JPG -vf scale=1296:972 *.JPG
Я не могу пошевелить мышью, выйти из программы, ничего. Это происходит после того, как я подтвердил, что хочу перезаписать файлы с такими же именами.
Поскольку после перезагрузки компьютера я не увидел, что никакие файлы не были изменены, я предполагаю, что FFmpeg ничего не вывел перед остановкой. Я пытался выполнить эту процедуру несколько раз, и каждый раз у меня зависал компьютер.
Как мне сказать FFmpeg «работать медленно», а не загружать мой процессор, и не могли бы вы оценить хорошие настройки, которые мне следует использовать для оптимальной производительности?
2 ответа
Используйте ImageMagic вместо FFmpeg.
Почему вы используете FFmpeg для обработки изображений? Вы используете инструмент, используемый в основном для обработки видео, для обработки статических изображений.
Да, я знаю, что FFmpeg может делать то, что вы пытаетесь сделать, но это не тот инструмент, который многие использовали бы в таком случае.
Просто установите ImageMagick и запустите эту команду:
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
Один из способов исправить это — использовать простой однострочный цикл Bash for, как показано ниже:
for i in *.JPG; do ffmpeg -i "$i" -vf scale=1296:972 "$i"-scaled.jpg; done
The for i in *.JPG;
часть можно перевести на английский как: «для всех файлов, заканчивающихся на '.JPG' (кстати, остальную часть имени присвойте переменной i )». do ffmpeg -i "$i"
можно перевести как: «сделайте следующее: вызовите ffmpeg и введите все файлы, имена которых соответствуют значению i , то есть все файлы, заканчивающиеся на .JPG». -vf scale=1296:972
часть переводится как: «примените видеофильтр «Масштаб», используя размеры 1296 на 972 (по умолчанию в пикселях)». "$i"-scaled.jpg
часть переводится как «все выходные файлы должны иметь свое исходное имя, за которым следует строка «-scaled.jpg». Заключительная часть,done
, не следует оставлять без внимания, так как именно он завершает цикл for, что приводит к прекращению выполнения команды Bash.