Pelajari cara membangun filtergraph kompleks dengan -filter_complex: memberi label pada stream, menggandakan video dengan split, menumpuk overlay, transisi xfade, mencampur audio, dan menghasilkan banyak output.

Di episode 16 kalian melihat rantai filter yang panjang — zscale, tonemap, dan teman-temannya — bekerja dalam satu baris. Itu adalah filtergraph dalam bentuk paling sederhana: sebuah pipa satu arah. Episode 17 ini adalah puncak dari semua yang kalian pelajari: bagaimana membangun filtergraph yang benar-benar kompleks — beberapa input, beberapa cabang, dan banyak output sekaligus.
Jika filter sederhana adalah satu jalur produksi, filtergraph kompleks adalah sebuah pabrik: bahan baku masuk dari banyak pintu, diproses lewat beberapa lini yang bisa bercabang dan bersatu kembali, lalu produk jadi keluar dari beberapa gerbang. Episode ini membahas alat untuk membangun pabrik itu — label, split, overlay, xfade, amix, dan amerge — beserta aturan yang membuat semua aliran frame tetap aman.
Semua filtergraph kompleks dibangun di atas satu konsep kecil yang menentukan segalanya: label. Label adalah nama yang ditempelkan pada sebuah aliran frame sehingga filter lain bisa merujuknya. FFmpeg memberi label otomatis pada stream input berupa kombinasi nomor input dan tipe stream, lalu filter-filter kita menempelkan label sendiri pada outputnya.
Contoh paling sederhana — satu input, satu filter, satu output berlabel:
ffmpeg -i input.mp4 -filter_complex "[0:v]hflip[v]" -map "[v]" output.mp4Di sini video dari input pertama diambil lewat label otomatisnya, diproses hflip, lalu hasilnya diberi label v. Perintah -map lalu memilih aliran berlabel itu sebagai output. Struktur label-diikuti-filter-diikuti-label — persis seperti pola yang tertulis pada contoh di atas — adalah "kalimat" dasar dari semua filtergraph kompleks.
Perbedaan krusial antara -vf dan -filter_complex:
-vf (alias -filter:v) adalah pintasan untuk graph satu input satu output, diterapkan ke semua stream video output.-filter_complex adalah graph penuh yang bisa memakan banyak input dan menghasilkan banyak output, dengan label sebagai alat komunikasinya. Ia selalu didampingi -map untuk memilih ke mana tiap output graph mengalir.Aturan praktisnya: untuk satu jalur sederhana, pakai -vf. Begitu ada dua input, dua output, atau percabangan, pindah ke -filter_complex.
Important
Tanpa -map yang merujuk label hasil graph, FFmpeg tidak akan otomatis memakai output filtergraph — kecuali hanya ada satu output video yang "jelas". Aturan -filter_complex + -map yang eksplisit menghindari kesalahan yang paling umum: hasil filter tidak terpakai, atau stream yang salah ikut ter-encode. Selalu tulis -map untuk setiap output yang kalian inginkan dari graph.
Filter split menyalin satu aliran menjadi beberapa salinan identik — bukan menggandakan file, hanya menggandakan rute frame dalam memori. Ini adalah fondasi dari hampir semua filtergraph yang menghasilkan lebih dari satu output.
Contoh klasiknya adalah picture-in-picture: video utama diputar, dan salinannya yang diperkecil ditempel di pojok sebagai pratinjau:
ffmpeg -i input.mp4 -filter_complex "[0:v]split[main][pip];[pip]scale=320:180[pips];[main][pips]overlay=main_w-overlay_w-10:10[v]" -map "[v]" -map 0:a output.mp4Perhatikan tiga hal dalam satu baris:
split memecah input menjadi dua salinan berlabel main dan pip, scale mengecilkan salinan PIP menjadi 320x180, lalu overlay menempelkannya di atas video utama.overlay memakan dua input — video latar dan video yang ditumpuk — lalu menghasilkan satu output berlabel v. Argumen main_w-overlay_w-10:10 menempatkan pratinjau 10 piksel dari tepi kanan dan 10 piksel dari tepi atas.-map 0:a, karena filtergraph ini hanya menyentuh video.Filter overlay adalah cara standar untuk menempelkan logo, watermark, gambar, atau teks beranimasi di atas video. Sifatnya yang memakan dua aliran dan menghasilkan satu membuatnya menjadi contoh sempurna bagaimana label menghubungkan cabang-cabang graph.
Menggabungkan dua klip dengan concat (episode 12) menghasilkan potongan yang langsung berpindah. Untuk transisi yang halus — fade, slide, atau wipe — FFmpeg punya filter xfade. Ia menghitung tumpang tindih antara akhir klip pertama dan awal klip kedua, lalu menerapkan kurva transisi selama durasi yang ditentukan:
ffmpeg -i clip1.mp4 -i clip2.mp4 -filter_complex "[0:v][1:v]xfade=transition=fade:duration=1:offset=3[v]" -map "[v]" output.mp4transition=fade memilih jenis transisi. Pilihan yang tersedia banyak: fade, slideleft, smoothleft, wipeleft, circleopen, dissolve, dan puluhan lainnya. Ganti saja nama transisinya.duration=1 berarti transisi berlangsung 1 detik.offset=3 adalah titik waktu (dalam detik, diukur pada timeline klip pertama) saat transisi dimulai. Dengan offset 3 dan durasi 1, klip pertama tayang penuh 3 detik, lalu 1 detik terakhirnya ber-irisan dengan awal klip kedua.Satu jebakan yang harus diwaspadai: xfade mengharapkan kedua input memiliki resolusi dan framerate yang sama. Jika tidak, hasilnya akan error atau aneh — samakan dulu dengan scale dan fps di depan xfade. Kalian juga biasanya ingin memberi fade di awal klip pertama dan akhir klip kedua agar transisi terasa lengkap, bukan hanya pada sambungannya.
Tip
Nilai offset maksimum adalah durasi klip pertama dikurangi durasi transisi. Jika offset terlalu besar, FFmpeg akan memberi error. Hitung dengan mudah: untuk klip 5 detik dan transisi 1 detik, offset maksimum adalah 4. Gunakan `ffprobe -show_entries format=duration -of default=nw=1 clip.mp4{:bash}` untuk memastikan durasi tiap klip sebelum menyusun graph.
Filtergraph tidak hanya soal video. Dua filter audio yang paling sering dipakai dalam graph kompleks adalah amix dan amerge, dan keduanya mudah tertukar:
amix mencampur beberapa aliran audio menjadi satu aliran dengan amplitude yang digabung — seperti memadukan dua suara menjadi satu track. Cocok untuk menumpuk musik latar dengan narasi.amerge menggabungkan channel dari beberapa aliran menjadi satu aliran multi-channel — seperti menggabungkan dua mono menjadi stereo kiri-kanan. Jumlah channel output sama dengan total channel input.Contoh amix — musik dan suara vokal dicampur menjadi satu track:
ffmpeg -i music.mp3 -i voice.mp3 -filter_complex "[0:a][1:a]amix=inputs=2:duration=longest:normalize=0[a]" -map "[a]" mix.mp3inputs=2 memberitahu jumlah input, duration=longest membuat output sepanjang input terpanjang (alternatifnya shortest atau first), dan normalize=0 mematikan penurunan volume otomatis — tanpa ini, dua sumber pada volume penuh akan di-"setengahkan" oleh amix, hasilnya lebih pelan dari yang kalian harapkan.
Contoh amerge — dua track mono menjadi stereo:
ffmpeg -i left.wav -i right.wav -filter_complex "[0:a][1:a]amerge=inputs=2[a]" -map "[a]" stereo.wavSumber kiri menempati channel kiri dan sumber kanan channel kanan. Ingat arahnya: amix mencampur amplitude (n track menjadi 1 track dengan semua suara), amerge menumpuk channel (n track menjadi 1 track dengan channel lebih banyak).
Keunggulan sejati -filter_complex muncul ketika satu graph menghasilkan banyak produk. Kombinasi split + beberapa -map memungkinkan satu input diproses sekali lalu dikeluarkan sebagai beberapa file dengan codec berbeda:
ffmpeg -i input.mp4 -filter_complex "[0:v]split[v1][v2]" \
-map "[v1]" -c:v libx264 -b:v 4M out-h264.mp4 \
-map "[v2]" -c:v libx265 -b:v 2M out-hevc.mkvInput didecode sekali, lalu split memberi dua salinan aliran video. Salinan pertama di-encode dengan libx264, salinan kedua dengan libx265 — semuanya dalam satu perintah dan satu pass decode. Tanpa split, kalian harus menjalankan FFmpeg dua kali dan mendecode input dua kali.
Perhatikan juga bahwa tiap output bisa punya pengaturan encoder sendiri, karena masing-masing dimulai dari label yang berbeda. Ini adalah pola yang sama yang dipakai di episode 14 untuk membangun beberapa variant HLS dalam satu perintah — bedanya di sini tidak ada muxer HLS, hanya file biasa.
Tip
Untuk output audio tambahan dari graph yang sama, cukup tambahkan -map 0:a pada output yang diinginkan — misalnya, pada contoh di atas, sisipkan -map 0:a pada argumen output H.264 agar file itu ikut membawa audio, sementara output HEVC dibiarkan video murni. Setiap -map harus merujuk label atau stream yang benar-benar ada; kalau tidak, FFmpeg akan menghentikan proses.
| Filter | Fungsi | Jumlah Input | Jumlah Output |
|---|---|---|---|
split | Menggandakan aliran frame | 1 | 2+ |
overlay | Menumpuk satu video di atas lainnya | 2 | 1 |
xfade | Transisi antar dua klip | 2 | 1 |
concat | Menggabungkan klip berurutan (re-encode) | 2+ | 1 |
amix | Mencampur amplitude beberapa audio | 2+ | 1 |
amerge | Menggabungkan channel beberapa audio | 2+ | 1 |
Warning
Filtergraph kompleks adalah kandidat utama untuk perintah yang "tampaknya benar tapi hasilnya salah". Biasakan menguji graph yang panjang dengan -t 5 (batasi durasi 5 detik) dan output sementara yang murah. Memverifikasi bagian kecil lebih dulu menghemat jam debugging; jangan menunggu sampai seluruh video selesai ter-encode baru menyadari transisinya salah tempat.
Pada episode 17 ini kalian telah mencapai puncak sintaks FFmpeg: memahami bahwa -filter_complex adalah graph berlabel yang menghubungkan banyak input dan output, memakai split untuk menggandakan aliran, overlay untuk menumpuk, xfade untuk transisi, amix dan amerge untuk pencampuran audio, serta -map untuk menyalurkan hasil graph ke banyak file sekaligus.
Poin kunci yang perlu dibawa pulang:
-vf untuk satu jalur; -filter_complex + -map untuk graph yang bercabang.split menggandakan rute frame; overlay menumpuk dua aliran; xfade memadukan dua klip.amix mencampur amplitude, amerge menumpuk channel — jangan tertukar.-t 5 sebelum menjalankan proses penuh.Dengan filtergraph, kalian sudah bisa membuat hampir semua efek video yang ada di aplikasi editing modern — dari overlay watermark, picture-in-picture, hingga transisi antar klip. Inilah batas dari apa yang bisa dilakukan dengan filter. Langkah berikutnya adalah melampaui filter: menekan ukuran dan meningkatkan kualitas dengan codec generasi baru.
Di episode 18 berikutnya kita akan membahas AV1 & Codec Modern — codec generasi berikutnya yang dipakai YouTube dan Netflix, bagaimana meng-encode AV1 dengan libaom dan SVT-AV1, serta kapan layak menggantikan H.264 dan HEVC. Pastikan tetap semangat!