
FFmpeg Nâng Cao: Chuyển Đổi Và Chỉnh Sửa Video Hàng Loạt Tự Động
FFmpeg là công cụ xử lý đa phương tiện mã nguồn mở mạnh mẽ, hỗ trợ hàng trăm codec và định dạng. Khi cần xử lý hàng chục, hàng trăm file video cùng lúc, việc gõ lệnh FFmpeg thủ công từng file là không khả thi. Bài viết này hướng dẫn kỹ thuật nâng cao để tự động hóa quy trình chuyển đổi và chỉnh sửa video hàng loạt trên Linux, macOS và Windows.

Tại Sao Cần Xử Lý Hàng Loạt?
Kịch bản phổ biến đòi hỏi xử lý batch:
- Chuyển đổi codec hàng loạt — ví dụ: AVI → MP4, MOV → WebM
- Resize/scale video — chuẩn hóa độ phân giải 1080p, 720p
- Cắt/ghép clip — tách cảnh intro/outro, nối nhiều file
- Trích xuất âm thanh — MP4 → MP3 hàng loạt
- Chèn watermark — đóng logo lên 100+ video quảng cáo
Phương Pháp 1: Vòng Lặp Bash Đơn Giản
Cách nhanh nhất cho người mới là dùng vòng lặp shell. Cú pháp này áp dụng cho Linux, macOS và Git Bash trên Windows.
for f in *.mp4; do
ffmpeg -i "$f" -c:v libx264 -crf 23 -c:a aac -b:a 128k "output/${f%.mp4}_h264.mp4"
done
Giải thích tham số:
-c:v libx264— mã hóa video bằng H.264-crf 23— chất lượng cố định (18-28, càng thấp càng nét)-c:a aac— mã hóa âm thanh AAC-b:a 128k— bitrate âm thanh 128 kbps
Phương Pháp 2: Shell Script Nâng Cao Với Bảng Mã
Khi cần logic phức tạp — kiểm tra file tồn tại, log lỗi, xử lý song song — hãy viết script hoàn chỉnh:
#!/bin/bash
# batch_convert.sh — Chuyển đổi hàng loạt video sang H.265/HEVC
INPUT_DIR="./raw"
OUTPUT_DIR="./converted"
LOG_FILE="./convert.log"
mkdir -p "$OUTPUT_DIR"
for file in "$INPUT_DIR"/*.{mp4,mov,avi,mkv}; do
[ -f "$file" ] || continue
filename=$(basename "$file")
output="$OUTPUT_DIR/${filename%.*}_hevc.mp4"
if [ -f "$output" ]; then
echo "Bỏ qua: $filename (đã tồn tại)" | tee -a "$LOG_FILE"
continue
fi
echo "Đang xử lý: $filename → $(basename "$output")"
ffmpeg -i "$file"
-c:v libx265 -crf 28 -preset fast
-c:a aac -b:a 192k
-movflags +faststart
"$output" 2>> "$LOG_FILE"
done
echo "Hoàn tất! Xem log tại $LOG_FILE"

So Sánh Codec Video
Lựa chọn codec phù hợp cân bằng giữa dung lượng và chất lượng:
| Codec | Lệnh FFmpeg | Ưu điểm | Nhược điểm |
|---|---|---|---|
| H.264 (AVC) | libx264 |
Tương thích rộng, hỗ trợ mọi thiết bị | Dung lượng lớn hơn H.265 |
| H.265 (HEVC) | libx265 |
Nén tốt hơn 40-50% so với H.264 | Thiết bị cũ không hỗ trợ |
| AV1 | libaom-av1 |
Nén tốt nhất, tiêu chuẩn tương lai | Mã hóa chậm, tốn CPU |
| VP9 | libvpx-vp9 |
Mã nguồn mở, hiệu quả cho WebM | Hỗ trợ phần cứng hạn chế |
Phương Pháp 3: Concat Demuxer Ghép Nhiều Video
FFmpeg cung cấp concat demuxer — phương pháp hiệu quả để nối video không cần re-encode (không mất chất lượng):
# Bước 1: Tạo file danh sách echo "file 'intro.mp4'" > list.txt echo "file 'part1.mp4'" >> list.txt echo "file 'part2.mp4'" >> list.txt echo "file 'outro.mp4'" >> list.txt # Bước 2: Ghép không mã hóa lại ffmpeg -f concat -safe 0 -i list.txt -c copy output_full.mp4
Lưu ý: Concat demuxer yêu cầu các file có cùng codec, độ phân giải và framerate. Nếu khác nhau, dùng filter concat:
ffmpeg -i part1.mp4 -i part2.mp4 -i part3.mp4
-filter_complex "[0:v][0:a][1:v][1:a][2:v][2:a]concat=n=3:v=1:a=1[outv][outa]"
-map "[outv]" -map "[outa]" merged.mp4

Xử Lý Song Song Và Tối Ưu Hiệu Năng
FFmpeg tự động sử dụng đa luồng CPU. Kiểm tra số thread với:
ffmpeg -hide_banner | grep "threads"
Ép số luồng xử lý song song khi chạy batch:
for f in *.mp4; do
ffmpeg -threads 4 -i "$f" -c:v libx264 -preset fast output/"$f"
done
Mẹo Tăng Tốc Xử Lý Hàng Loạt
- Dùng
-preset fast— cân bằng tốc độ và nén - Bỏ qua re-encode khi không cần —
-c copy - Xử lý song song nhiều tiến trình —
GNU Parallelhoặcxargs -P - GPU acceleration —
-c:v h264_nvenc(NVIDIA) hoặc-c:v h264_videotoolbox(macOS)
Tự Động Hóa Với Python Và Subprocess
Khi cần tích hợp vào ứng dụng, dùng Python gọi FFmpeg qua subprocess:
import subprocess
import glob
videos = glob.glob("*.mp4")
for video in videos:
output = f"converted/{video}"
cmd = [
"ffmpeg", "-i", video,
"-c:v", "libx264", "-crf", "23",
"-c:a", "aac", "-b:a", "128k",
output
]
subprocess.run(cmd, capture_output=True)
Khắc Phục Sự Cố Thường Gặp
- Lỗi “Unknown encoder” — cài FFmpeg đầy đủ:
sudo apt install ffmpeg - File output lớn — tăng CRF (22-28), giảm bitrate
- Mất âm thanh — kiểm tra codec âm thanh input với
ffprobe - Concat lỗi — đảm bảo các file cùng codec/resolution hoặc dùng filter_complex
Kết Luận
FFmpeg xử lý video hàng loạt tiết kiệm hàng giờ thao tác thủ công. Từ vòng lặp shell đơn giản đến script phức tạp với log, lỗi handling, bạn có thể tự động hóa toàn bộ pipeline xử lý video. Kết hợp với GNU Parallel và GPU encoding, thời gian xử lý hàng trăm file giảm từ ngày xuống vài giờ.
Tài liệu tham khảo:
