Pada episode ini kalian memproses ratusan file sekaligus dengan loop shell, menjalankan konversi paralel dengan find dan xargs, serta menulis script batch yang aman dan bisa diulang.

Sejauh ini setiap episode mengolah satu file. Tapi di dunia nyata, media datang dalam jumlah besar: 500 klip mentah dari sesi rekaman, ribuan file yang harus diubah formatnya setiap rilis, atau satu folder arsip lama yang harus diseragamkan. Menjalankan perintah satu per satu untuk semua file itu bukan sekadar membosankan — itu rawan salah dan menghabiskan waktu.
Episode ini mengubah FFmpeg dari tool manual menjadi mesin batch: loop shell untuk memproses banyak file, output naming yang rapi, konversi paralel, dan script yang aman dijalankan berulang kali. Ini keterampilan yang langsung dipakai di produksi.
Inti batch processing di shell adalah perulangan for. Gaya bahasanya: untuk setiap file yang cocok dengan pola, jalankan ffmpeg.
for file in *.mp4; do
ffmpeg -i "$file" -c:v libx264 "${file%.mp4}.mkv"
doneMari bedah baris demi baris. *.mp4 memperluas ke semua file MP4 di direktori saat ini. Setiap nama file ditampung variabel file. Perintah ffmpeg dipanggil dengan nama output yang diambil dari variabel — bagian %.mp4 menghapus ekstensi, lalu kita tambahkan .mkv di belakangnya. Hasilnya: video.mp4 menjadi video.mkv, adik.mp4 menjadi adik.mkv, dan seterusnya.
Tip
Selalu bungkus variabel dengan tanda kutip ganda: ffmpeg -i "$file". Nama file yang mengandung spasi — seperti klip malam.mp4 — akan dipecah menjadi argumen terpisah tanpa kutipan, dan perintah langsung gagal. Kutipan ganda adalah kebiasaan kecil dengan dampak besar.
Output yang menimpa file asli adalah jalan menuju bencana. Biasakan menulis hasil ke nama yang jelas berbeda, atau lebih baik lagi, ke direktori terpisah.
for file in *.mp4; do
ffmpeg -i "$file" -c:v libx264 "${file%.mp4}-h264.mp4"
donePenambahan akhiran -h264 membuat setiap output mudah dikenali dan tidak menimpa sumber. Untuk folder output terpisah, buat direktori dulu lalu arahkan hasilnya:
mkdir -p converted
for file in *.mp4; do
ffmpeg -i "$file" -c:v libx264 "converted/${file}"
doneDengan pola ini, folder converted berisi hasil dan folder sumber tetap bersih — kalian bisa membandingkan atau mengecek ulang tanpa takut data hilang.
Loop berjalan berurutan — satu file selesai baru file berikutnya mulai. Untuk folder berisi ratusan file, ini lambat. CPU modern punya banyak core; gunakan semuanya dengan xargs -P yang menjalankan banyak perintah bersamaan.
find . -name "*.mp4" -print0 | xargs -0 -P 4 -I {} ffmpeg -y -i {} -c:v libx264 {}.h264.mp4Mari bedah: find menemukan semua MP4 dan mengeluarkannya dengan pemisah null (-print0) agar aman untuk nama ber-spasi. xargs -0 membaca daftar itu, -P 4 menjalankan empat proses ffmpeg sekaligus, dan -I {} mengganti {} dengan setiap nama file. Hasilnya dua hingga empat kali lipat kecepatan dibanding loop sekuensial.
Warning
Paralelisme menggandakan beban mesin. -P 4 menandakan empat konversi bersamaan — sesuaikan dengan jumlah core kalian (nproc). Jangan pernah mengarahkan output ke folder yang sama dengan input, dan jangan pakai pola output yang bisa menimpa antar file — dua proses menulis ke satu file adalah resep file rusak.
Loop di terminal cukup untuk sekali pakai. Untuk pekerjaan berulang — misalnya jalur konversi standar tim — tulis script yang bisa dijalankan kapan pun dengan hasil konsisten. Berikut pola yang sudah diajarkan disiplin aman.
#!/usr/bin/env bash
set -euo pipefail
src_dir="${1:?usage: $0 <source dir>}"
out_dir="${src_dir}/converted"
mkdir -p "$out_dir"
for file in "$src_dir"/*.mp4; do
[ -e "$file" ] || continue
name="$(basename "$file" .mp4)"
echo "converting: $file"
ffmpeg -y -i "$file" -c:v libx264 -c:a aac "$out_dir/${name}.mp4"
done
echo "done: $(find "$out_dir" -name '*.mp4' | wc -l) files"Mari kita lihat mengapa setiap bagian ada:
set -euo pipefail — berhenti saat ada error (-e), tolak variabel tak terdefinisi (-u), deteksi kegagalan di tengah pipeline (-o pipefail).[ -e "$file" ] || continue — melewati pola glob yang tidak cocok dengan file apa pun.-y — menjawab "iya" untuk overwrite otomatis, supaya script tidak menunggu konfirmasi.converted/ — sumber tidak pernah tersentuh.Beberapa prinsip membuat pipeline batch aman dijalankan berulang kali (idempoten):
-y untuk selalu menimpa, atau -n untuk tidak pernah menimpa. Jangan biarkan FFmpeg bertanya interaktif — script akan menggantung.-hide_banner dan -loglevel error membuat log script bersih; error yang relevan tetap tampil.ffmpeg -hide_banner -loglevel error -i input.mp4 -c copy output.mp4Dengan mode senyap ini, output script hanya berisi pesan dari echo yang kalian tulis — mudah dibaca dan mudah dicari di log CI/CD.
Important
Jalankan batch di mesin dengan sumber daya yang cukup, dan selalu siapkan waktu dan space disk yang realistis. Satu menit video 1080p re-encode bisa butuh beberapa detik hingga menit di satu core; seratus file berarti lipatannya. Cek ruang disk dengan df -h sebelum melepas batch besar.
Pada episode 9 ini kalian telah mengubah FFmpeg menjadi mesin batch: loop for untuk banyak file, output naming dengan variabel shell, konversi paralel dengan find + xargs -P, serta script produksi yang aman dengan -y, set -euo pipefail, dan verifikasi hasil.
Inti yang perlu dibawa pulang: batch processing bukan soal mengetik cepat, tapi soal aman. Script yang bisa dijalankan ulang tanpa takut menimpa file asli atau berhenti di tengah adalah aset — dan dua prinsipnya sederhana: output selalu terpisah, dan setiap kegagalan terlihat jelas.
Di episode 10 selanjutnya kita akan berhenti memproses video sebagai video — kalian akan membuat thumbnail, gambar frame, dan GIF animasi dari video, lengkap dengan optimasi palet agar GIF terlihat profesional. Sampai jumpa di episode 10!