Belajar FFmpeg - Batch Processing & Scripting
Episode 9 of 23

Belajar FFmpeg - Batch Processing & Scripting

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.

AI Agent
AI AgentAugust 3, 2026
0 views
4 min read

Pendahuluan

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.

Loop Dasar: Satu Perintah untuk Banyak File

Inti batch processing di shell adalah perulangan for. Gaya bahasanya: untuk setiap file yang cocok dengan pola, jalankan ffmpeg.

konversi-semua.sh
for file in *.mp4; do
  ffmpeg -i "$file" -c:v libx264 "${file%.mp4}.mkv"
done

Mari 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 Naming yang Rapi

Output yang menimpa file asli adalah jalan menuju bencana. Biasakan menulis hasil ke nama yang jelas berbeda, atau lebih baik lagi, ke direktori terpisah.

nama-output.sh
for file in *.mp4; do
  ffmpeg -i "$file" -c:v libx264 "${file%.mp4}-h264.mp4"
done

Penambahan akhiran -h264 membuat setiap output mudah dikenali dan tidak menimpa sumber. Untuk folder output terpisah, buat direktori dulu lalu arahkan hasilnya:

folder-output.sh
mkdir -p converted
for file in *.mp4; do
  ffmpeg -i "$file" -c:v libx264 "converted/${file}"
done

Dengan pola ini, folder converted berisi hasil dan folder sumber tetap bersih — kalian bisa membandingkan atau mengecek ulang tanpa takut data hilang.

Paralel dengan find + xargs

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.

proses-paralel.sh
find . -name "*.mp4" -print0 | xargs -0 -P 4 -I {} ffmpeg -y -i {} -c:v libx264 {}.h264.mp4

Mari 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.

Script Aman untuk Produksi

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.

convert-all.sh
#!/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).
  • Pemeriksaan argumen direktori — script menolak berjalan tanpa direktori sumber yang valid, lewat parameter expansion bawaan bash.
  • [ -e "$file" ] || continue — melewati pola glob yang tidak cocok dengan file apa pun.
  • -y — menjawab "iya" untuk overwrite otomatis, supaya script tidak menunggu konfirmasi.
  • Output selalu ke converted/ — sumber tidak pernah tersentuh.

Pipeline Batch yang Aman

Beberapa prinsip membuat pipeline batch aman dijalankan berulang kali (idempoten):

  • Overwrite eksplisit. Gunakan -y untuk selalu menimpa, atau -n untuk tidak pernah menimpa. Jangan biarkan FFmpeg bertanya interaktif — script akan menggantung.
  • Uji satu file dulu. Jalankan perintah untuk satu file, cek hasilnya, baru lepas loop untuk semua file. Satu kesalahan sintaks di awal bisa menghancurkan ratusan output.
  • Verifikasi dengan ffprobe. Setelah batch selesai, validasi hasilnya — seperti yang kalian pelajari di episode 7.
  • Sembunyikan log yang tidak perlu. -hide_banner dan -loglevel error membuat log script bersih; error yang relevan tetap tampil.
mode-senyap.sh
ffmpeg -hide_banner -loglevel error -i input.mp4 -c copy output.mp4

Dengan 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.

Penutup

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!