Belajar FFmpeg - Concat & Segmenting
Episode 12 of 23

Belajar FFmpeg - Concat & Segmenting

Pelajari cara menggabungkan beberapa file video menjadi satu dengan concat demuxer dan concat filter, serta memotong video menjadi segmen-segmen kecil dengan muxer segment sebagai persiapan untuk streaming.

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

Pendahuluan

Pada episode 11 kalian sudah belajar mengelola metadata, menanam subtitle, dan membungkus video dengan chapter. Sekarang mari kita bahas dua masalah yang saling berkebalikan namun sangat sering muncul di produksi: menggabungkan beberapa klip menjadi satu video utuh, dan membagi satu video panjang menjadi potongan-potongan kecil. Dua masalah ini diselesaikan oleh satu keluarga muxer di FFmpeg: concat untuk menggabungkan, dan segment untuk memotong.

Konsep kuncinya adalah bahwa menggabungkan dan memotong pada dasarnya adalah pekerjaan wadah (container), bukan codec. Kalian tidak selalu harus meng-encode ulang. Karena itu inti episode ini adalah menjawab dua pertanyaan: kapan kalian boleh melakukannya tanpa re-encode, dan kapan kalian wajib meng-encode ulang. Jawabannya menentukan perintah mana yang kalian pakai.

Menggabungkan File dengan concat

Ada dua mekanisme concat di FFmpeg yang sering tertukar: concat demuxer dan concat filter. Perbedaan dasarnya sederhana — concat demuxer bekerja di level paket sehingga cepat dan tanpa re-encode, sedangkan concat filter bekerja di level frame sehingga lambat namun sangat fleksibel. Pilihan di antara keduanya hampir selalu ditentukan oleh kondisi file input.

concat Demuxer: Saat File Bisa "Dilem" Langsung

Analogi yang paling pas: menggabungkan gerbong kereta. Jika semua gerbong memakai lebar rel yang sama, kalian cukup menyambungkannya tanpa mengubah apa pun. concat demuxer bekerja persis seperti itu — asalkan semua file punya codec, resolusi, framerate, pixel format, sample rate, dan jumlah channel yang identik, FFmpeg cukup menyambung paket-paketnya tanpa mendecode apapun.

Cara kerjanya: kalian tulis daftar file dalam sebuah file teks, lalu FFmpeg membaca daftar itu seolah-olah satu input:

list.txt - daftar file yang akan digabung
file 'part-01.mp4'
file 'part-02.mp4'
file 'part-03.mp4'

Kemudian jalankan concat demuxer dengan -f concat:

Gabungkan dengan concat demuxer
ffmpeg -f concat -safe 0 -i list.txt -c copy gabungan.mp4
  • -f concat memaksa FFmpeg menafsirkan list.txt sebagai skrip concat, bukan file media biasa.
  • -safe 0 mengizinkan path absolut atau karakter khusus di dalam daftar. Default-nya -safe 1, yang hanya menerima nama file relatif polos — biarkan saja jika daftar kalian memang sederhana.
  • -c copy menyalin stream tanpa re-encode. Inilah yang membuat prosesnya secepat menyalin file: tidak ada decode, tidak ada encode.

Tip

Daftar concat mengikuti format ffconcat. Untuk kontrol yang lebih presisi, FFmpeg juga mendukung direktif duration, inpoint, dan outpoint di dalam daftar — berguna ketika durasi sebuah file tercatat salah atau ketika kalian hanya ingin mengambil sebagian dari tiap file. Contohnya: baris file 'part-01.mp4' yang diikuti baris duration 12.5 akan membuat FFmpeg menganggap file itu berdurasi 12,5 detik.

Aturan emasnya: jika ada satu saja file yang berbeda — resolusi 1080p dicampur 720p, atau framerate 30 dicampur 60 — concat demuxer bisa menghasilkan timeline yang kacau: video loncat-loncat, audio mendahului gambar, atau resolusi berubah mendadak di tengah-tengah. Selalu cek semua file dengan `ffprobe -show_streams file.mp4{:bash}` sebelum memutuskan memakai jalur ini.

concat Filter: Saat Parameter Berbeda

Ketika file input tidak seragam, kalian harus meng-encode ulang, dan di sinilah concat filter bekerja. Berbeda dengan demuxer, concat filter adalah filter video dan audio yang menggabungkan frame demi frame di dalam filtergraph — dan semua frame dari seluruh input harus memiliki format yang sama. Jika belum, tambahkan scale, fps, dan format di depan concat agar semua input "dipaksa seragam" dulu.

Contoh menggabungkan dua file dengan parameter berbeda menggunakan concat filter:

Gabungkan dua input dengan concat filter
ffmpeg -i part-a.mp4 -i part-b.mp4 -filter_complex "[0:v][0:a][1:v][1:a]concat=n=2:v=1:a=1[v][a]" -map "[v]" -map "[a]" output.mp4

Mari kita bedah bagian pentingnya. Label yang memakai kombinasi nomor input dan huruf tipe stream — video dan audio dari input pertama, lalu video dan audio dari input kedua — menandai aliran yang akan digabung. Filter concat menerima urutan stream tersebut, lalu n=2 memberi tahu bahwa ada dua input yang digabung, v=1 berarti satu stream video, dan a=1 berarti satu stream audio. Hasilnya diberi label baru yang kemudian dipetakan ke output dengan -map. Perhatikan bahwa kali ini tidak ada -c copy — wajib, karena frame-frame hasil filter harus di-encode ulang ke codec tujuan.

Important

Jangan pernah mencampur concat demuxer dan concat filter sembarangan. concat demuxer adalah muxer yang memakan daftar file dan menyambung paket; concat filter adalah filter di dalam filtergraph yang memakan frame. Mereka menempati lapisan yang berbeda, dan keduanya tidak bisa saling menggantikan. Kalau input seragam, pakai demuxer yang cepat. Kalau tidak seragam, pakai filter yang fleksibel.

Memotong Video dengan Muxer segment

Sekarang kebalikannya: membagi satu video menjadi banyak potongan kecil. FFmpeg menyediakan muxer segment untuk keperluan ini, dan ia adalah saudara tua dari muxer hls yang akan kita pelajari di episode 14. Muxer segment memotong video berdasarkan durasi atau ukuran, dan menulis tiap potongan ke file terpisah dengan pola nama yang bisa kita tentukan.

Contoh paling sederhana — memotong video menjadi segmen 10 detik:

Potong video menjadi segmen 10 detik
ffmpeg -i input.mp4 -c copy -f segment -segment_time 10 seg-%03d.mp4
  • -f segment memilih muxer segment.
  • -segment_time 10 menargetkan tiap segmen berdurasi sekitar 10 detik.
  • seg-%03d.mp4 adalah pola nama file; %03d digantikan nomor urut dengan tiga digit nol di depan, sehingga menghasilkan seg-000.mp4, seg-001.mp4, dan seterusnya.

Ada dua detail yang wajib dipahami. Pertama, segmen dipotong pada keyframe berikutnya setelah durasi terlewati, bukan tepat pada detik ke-10. Jika kalian ingin pemotongan yang rapi dan prediktif, kunci interval keyframe: gunakan -force_key_frames untuk memaksa keyframe pada titik yang kalian inginkan, misalnya setiap 2 detik. Kedua, gunakan -reset_timestamps 1 agar timestamp tiap segmen mulai dari nol — tanpa ini, segmen pertama akan terlihat "berpindah ke detik ke-30" saat diputar.

Segmen MPEG-TS dengan timestamp dinolkan
ffmpeg -i input.mp4 -c copy -f segment -segment_time 10 -segment_format mpegts -reset_timestamps 1 seg-%03d.ts

Mengapa mpegts? Karena segmen untuk streaming biasanya ditulis sebagai MPEG-TS, bukan MP4. Alasan teknisnya: MP4 menyimpan durasi stream di header paling depan, sehingga sebuah potongan MP4 yang terpisah tidak bisa diputar mandiri dengan benar; MPEG-TS justru dirancang untuk di-splice potongan-per-potongan. Ini menjadi fondasi dari HLS, yang menuntut tiap segmen dapat didekode secara independen.

Tip

Muxer segment juga bisa langsung menghasilkan playlist. Tambahkan -segment_list daftar.m3u8 -segment_list_type m3u8 dan FFmpeg akan menulis file daftar yang mereferensikan semua segmen yang dihasilkan. Playlist yang kita hasilkan secara manual di sini adalah cikal bakal dari apa yang akan dilakukan muxer hls secara otomatis di episode 14 — hanya saja -f hls jauh lebih lengkap untuk kebutuhan streaming.

Menyiapkan Segmen untuk Streaming

Mengapa semua repot memotong video? Jawabannya adalah streaming adaptif. Sebuah file video besar harus diunduh dulu seluruhnya sebelum bisa diputar dari posisi tengah; sebaliknya, video yang dipecah menjadi segmen-segmen kecil bisa diputar sepotong demi sepotong — pemutar cukup mengunduh segmen berikutnya saat segmen sebelumnya hampir habis. Ditambah beberapa variasi kualitas, ini adalah cara kerja semua platform streaming besar bekerja. Kita akan merangkainya menjadi HLS lengkap di episode 14, tapi sebelum itu, pahami dulu tiga jebakan yang paling sering membuat hasil segmenting rusak.

Pertama, segmen harus bisa didekode mandiri. Pemutar streaming men-decode setiap segmen secara independen dari segmen lain. Jika pemotongan dilakukan bukan pada keyframe, segmen pertama dari tiap potongan akan kekurangan frame referensi dan ditampilkan sebagai kotak abu-abu. Pastikan -segment_time adalah kelipatan dari interval keyframe, atau paksa keyframe dengan -force_key_frames.

Kedua, jangan campur parameter antar segmen. Satu-satunya keuntungan besar -c copy adalah kecepatan, tapi ia hanya aman bila source-nya stabil. Jika source berubah bitrate atau resolusi di tengah, segmen hasil copy bisa memiliki parameter yang tidak konsisten antar segmen.

Ketiga, verifikasi hasil dengan ffprobe. Ambil beberapa segmen acak dan periksa ffprobe masing-masing. Sebuah segmen yang "sehat" menunjukkan codec yang sama, durasi yang wajar, dan resolusi yang konsisten. Kebiasaan memverifikasi output di titik-titik penting seperti inilah yang membedakan pemakai FFmpeg yang handal dari yang hanya menghafal perintah.

Warning

Hati-hati dengan -c copy pada segmen. Ketika source dan target menggunakan container yang berbeda — misalnya MP4 ke MPEG-TS — paket H.264 harus dikonversi dulu dari format AVCC ke Annex B agar bisa dibaca pemutar. FFmpeg biasanya menangani ini otomatis lewat bitstream filter, tapi jika segmen hasil copy gagal diputar, periksa log untuk pesan seperti "Malformed NAL unit" — itu pertanda kalian perlu re-encode atau menambahkan bitstream filter h264_mp4toannexb secara eksplisit.

Penutup

Pada episode 12 ini kalian telah belajar bahwa menggabungkan dan memotong adalah pekerjaan container yang sangat bergantung pada kondisi file: concat demuxer menyambung paket tanpa re-encode hanya jika semua file seragam, concat filter meng-encode ulang frame ketika parameter berbeda, dan muxer segment membagi video menjadi segmen-segmen kecil yang siap untuk streaming dengan pola nama, pemotongan pada keyframe, serta penulisan playlist.

Poin kunci yang perlu dibawa pulang:

  • concat demuxer = cepat, tanpa re-encode, tapi hanya untuk file yang seragam.
  • concat filter = fleksibel, wajib re-encode, untuk file yang parameternya berbeda.
  • Muxer segment memotong pada keyframe; selaraskan segment_time dengan interval keyframe.
  • -reset_timestamps 1 membuat tiap segmen mulai dari nol.
  • Segmen streaming biasanya ditulis sebagai MPEG-TS agar bisa didekode mandiri.

Sekarang kalian sudah bisa memecah video menjadi segmen dan (secara manual) menyusun playlist-nya. Langkah logis berikutnya adalah mengirim segmen dan stream itu keluar dari komputer kalian — ke server streaming, ke jaringan, atau ke penonton langsung.

Di episode 13 berikutnya kita akan membahas Streaming & Network Protocols — bagaimana FFmpeg berkomunikasi lewat RTSP, RTMP, SRT, dan UDP, serta bagaimana menyusun pipeline capture-encode-push untuk live streaming dengan latensi rendah. Pastikan tetap semangat!