Tự động hóa và phát triển

Cách Chuyển Đổi Ảnh Hàng Loạt với FFmpeg: Hướng Dẫn Thực Hành

5 phút đọc
Cách Chuyển Đổi Ảnh Hàng Loạt với FFmpeg: Hướng Dẫn Thực Hành

Bạn có 500 ảnh chụp màn hình PNG cần chuyển đổi sang WebP cho website. FFmpeg nổi tiếng là công cụ video nhưng xử lý ảnh cũng tốt không kém.

Tại sao dùng FFmpeg cho ảnh?

FFmpeg có thể đã được cài đặt nếu bạn làm việc với video. Với định dạng RAW (CR2, NEF, ARW), dùng darktable hoặc RawTherapee.

Cài đặt FFmpeg

bash
# macOS
brew install ffmpeg

# Ubuntu / Debian
sudo apt install ffmpeg

# Windows (Chocolatey)
choco install ffmpeg

bash
ffmpeg -version

Cấu trúc cơ bản

Mỗi lệnh chuyển đổi hàng loạt đều có cùng cấu trúc: vòng lặp shell (Linux/macOS) hoặc vòng lặp for (Windows). Luôn ghi vào thư mục đầu ra riêng.

Chuyển đổi hàng loạt PNG sang 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:vChất lượngSử dụng điển hình
1-2Gần như không mấtIn ấn, lưu trữ
3-5Chất lượng caoNhiếp ảnh web
6-10Chất lượng trung bìnhXem trước
11+Chất lượng thấpTránh dùng

Chuyển đổi hàng loạt JPG sang 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 tạo ra file thường nhỏ hơn 25–35 % so với JPG tương đương. Với ảnh chụp, 80–85 là khoảng tối ưu.

Chuyển đổi sang PNG

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

Chuyển đổi định dạng hỗn hợp

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

Thay đổi kích thước và chuyển đổi trong một bước

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

Xử lý đệ quy thư mục con

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

Xử lý song song để tăng tốc

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

Trên máy 8 nhân với SSD, xử lý song song thường giảm thời gian chuyển đổi 3–5 lần.

Chỉ báo tiến trình

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

Xử lý lỗi

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

Tham khảo lệnh

Chuyển đổiLệnh (Linux/macOS)Ghi chú
Tất cả PNG → JPGfor f in *.pngdo ffmpeg -i "$f" -q:v 3 output/${f%.png}.jpg
Tất cả JPG → WebPfor f in *.jpgdo ffmpeg -i "$f" -quality 85 output/${f%.jpg}.webp
Tất cả JPG → PNGfor f in *.jpgdo ffmpeg -i "$f" output/${f%.jpg}.png
Tất cả → WebP không mấtfor f in *.pngdo ffmpeg -i "$f" -lossless 1 output/${f%.png}.webp
Thay đổi kích thước + chuyển đổifor f in *.jpgdo ffmpeg -i "$f" -vf scale=1080:-1 -q:v 3 output/${f%.jpg}.jpg

Khi FFmpeg không phải công cụ phù hợp

Định dạng RAW máy ảnh — hỗ trợ hạn chế. Dùng darktable hoặc RawTherapee.

Encoding AVIF — có thể nhưng rất chậm nếu không có tăng tốc phần cứng.

Chỉ vài file? FastConvert nhanh hơn — không cần cài đặt.

Câu hỏi thường gặp

Mặc định không. Thêm -map_metadata 0: ffmpeg -i input.jpg -map_metadata 0 -q:v 3 output.jpg

Xảy ra khi JPG nguồn đã bị nén nhiều. Luôn chuyển đổi từ nguồn chất lượng cao nhất.

Dùng PNG làm định dạng đầu ra hoặc -lossless 1 cho WebP.

Thêm -y để ghi đè tự động hoặc -n để bỏ qua file hiện có.

Tổng kết

Chuyển đổi ảnh hàng loạt với FFmpeg xoay quanh một vòng lặp shell đơn giản. Luôn thử nghiệm với một batch nhỏ trước khi xử lý toàn bộ thư viện.

Cần chuyển đổi ảnh không dùng dòng lệnh? FastConvert — miễn phí, không cần đăng ký.

Chia sẻ