Автоматизація та розробка

Пакетна конвертація зображень з FFmpeg: практичний посібник

5 хв читання
Пакетна конвертація зображень з FFmpeg: практичний посібник

У вас є 500 PNG-скриншотів для конвертації в WebP. FFmpeg відомий насамперед як відеоінструмент, але з зображеннями він справляється не гірше — і оскільки працює з командного рядка, однією командою обробляє будь-яку кількість файлів.

Чому FFmpeg для зображень?

FFmpeg, ймовірно, вже встановлений, якщо ви працюєте з відео. Для RAW-форматів (CR2, NEF, ARW) використовуйте darktable або RawTherapee.

Встановлення FFmpeg

bash
# macOS
brew install ffmpeg

# Ubuntu / Debian
sudo apt install ffmpeg

# Windows (Chocolatey)
choco install ffmpeg

bash
ffmpeg -version

Базова структура команди

Кожна команда пакетної конвертації має однакову структуру: цикл оболонки (Linux/macOS) або цикл for (Windows). Завжди записуйте результат в окрему директорію.

Пакетна конвертація PNG у JPG

bash
mkdir -p output
for f in *.png; do
  ffmpeg -i "$f" -q:v 2 "output/${f%.png}.jpg"
done

bash
mkdir output
for %f in (*.png) do ffmpeg -i "%f" -q:v 2 "output/%~nf.jpg"

bash
New-Item -ItemType Directory -Force output
Get-ChildItem *.png | ForEach-Object {
  ffmpeg -i $_.FullName -q:v 2 "output/$($_.BaseName).jpg"
}

-q:vЯкістьТипове використання
1-2Майже без втратДрук, архівування
3-5Висока якістьВеб-фотографія
6-10Середня якістьПопередній перегляд
11+Низька якістьУникати

Пакетна конвертація JPG у WebP

bash
mkdir -p output
for f in *.jpg *.jpeg; do
  [ -f "$f" ] || continue
  ffmpeg -i "$f" -quality 85 "output/${f%.*}.webp"
done

bash
mkdir -p output
for f in *.png; do
  ffmpeg -i "$f" -lossless 1 "output/${f%.png}.webp"
done

WebP зазвичай дає файли на 25–35 % менші за еквівалентний JPG. Для фотографій оптимальний діапазон 80–85.

Конвертація в PNG

bash
mkdir -p output
for f in *.jpg *.jpeg; do
  [ -f "$f" ] || continue
  ffmpeg -i "$f" "output/${f%.*}.png"
done

Конвертація змішаних форматів

bash
mkdir -p output
for f in *.jpg *.jpeg *.png *.webp *.tiff *.bmp; do
  [ -f "$f" ] || continue
  ffmpeg -i "$f" -q:v 3 "output/${f%.*}.jpg"
done

Зміна розміру разом із конвертацією

bash
mkdir -p output
for f in *.png; do
  ffmpeg -i "$f" -vf scale=1080:-1 -q:v 3 "output/${f%.png}.jpg"
done

bash
mkdir -p output
for f in *.jpg; do
  ffmpeg -i "$f" -vf "crop='min(iw,ih)':'min(iw,ih)',scale=200:200" \
    "output/${f%.jpg}_thumb.jpg"
done

Рекурсивна обробка піддиректорій

bash
find . -name "*.png" -not -path "./output*" | while read f; do
  output="output/${f#./}"
  mkdir -p "$(dirname "$output")"
  ffmpeg -i "$f" -q:v 3 "${output%.png}.jpg"
done

Паралельна обробка для прискорення

bash
mkdir -p output
ls *.png | xargs -P 4 -I {} sh -c 'ffmpeg -i "$1" -q:v 3 "output/${1%.png}.jpg"' _ {}

На 8-ядерному комп'ютері з SSD паралельна обробка зазвичай скорочує час конвертації у 3–5 разів.

Індикатор прогресу

bash
total=$(ls *.png | wc -l)
count=0
mkdir -p output
for f in *.png; do
  count=$((count + 1))
  echo "[$count/$total] $f"
  ffmpeg -loglevel quiet -i "$f" -q:v 3 "output/${f%.png}.jpg"
done

Обробка помилок

bash
mkdir -p output
error_log="errors.txt"
> "$error_log"
for f in *.jpg *.jpeg *.png *.webp; do
  [ -f "$f" ] || continue
  if ffmpeg -loglevel error -i "$f" -quality 85 "output/${f%.*}.webp" 2>>"$error_log"; then
    echo "✓ $f"
  else
    echo "✗ $f"
  fi
done

Довідник команд

КонвертаціяКоманда (Linux/macOS)Примітка
Усі PNG → JPGfor f in *.pngdo ffmpeg -i "$f" -q:v 3 output/${f%.png}.jpg
Усі JPG → WebPfor f in *.jpgdo ffmpeg -i "$f" -quality 85 output/${f%.jpg}.webp
Усі JPG → PNGfor f in *.jpgdo ffmpeg -i "$f" output/${f%.jpg}.png
Усі → WebP без втратfor f in *.pngdo ffmpeg -i "$f" -lossless 1 output/${f%.png}.webp
Зміна розміру + конвертаціяfor f in *.jpgdo ffmpeg -i "$f" -vf scale=1080:-1 -q:v 3 output/${f%.jpg}.jpg

Коли FFmpeg — не найкращий інструмент

RAW-формати камери — обмежена підтримка. Використовуйте darktable або RawTherapee.

Кодування AVIF — можливе, але дуже повільне без апаратного прискорення.

Лише кілька файлів? FastConvert швидше — без встановлення.

Поширені запитання

За замовчуванням ні. Додайте -map_metadata 0: ffmpeg -i input.jpg -map_metadata 0 -q:v 3 output.jpg

Трапляється, коли вихідний JPG вже сильно стиснутий. Завжди конвертуйте з джерела найвищої якості.

Використовуйте PNG як вихідний формат або -lossless 1 для WebP.

Додайте -y для автоматичного перезапису або -n для пропуску наявних файлів.

Підсумок

Пакетна конвертація зображень через FFmpeg будується на простому циклі. Завжди тестуйте на невеликому пакеті перед обробкою всієї бібліотеки.

Потрібно конвертувати зображення без командного рядка? FastConvert — безкоштовно, без реєстрації.

Поділитися