- Membahas struktur dan cara penggunaan framework FFmpeg untuk encoding, decoding, transcoding audio dan video, serta streaming
- Menjelaskan secara konkret peran alat command line seperti ffmpeg, ffplay, ffprobe dan library inti seperti libavcodec, libavformat, libavfilter
- Mengimplementasikan analisis stream dan prosedur decoding berbasis AVFormatContext, AVCodecContext, AVPacket, AVFrame secara bertahap
- Menggunakan sistem build meson/ninja untuk mengunduh dan mengompilasi kode contoh secara otomatis, lalu menganalisis file media sampel dan menampilkan hasilnya
- Dapat digunakan sebagai materi pengantar berbasis praktik untuk memahami prinsip kerja internal FFmpeg dan pipeline decoding
Komposisi paket FFmpeg
- FFmpeg terdiri dari kumpulan alat dan library yang dapat melakukan encoding, decoding, transcoding berbagai format audio dan video, serta streaming melalui jaringan
-
Alat FFmpeg
- ffmpeg: alat konversi format multimedia berbasis command line
- ffplay: pemutar media sederhana berbasis SDL dan library FFmpeg
- ffprobe: alat untuk menganalisis stream multimedia
-
Library FFmpeg
- libavformat: menyediakan fungsi input/output dan muxing/demuxing
- libavcodec: menyediakan fungsi encoding/decoding
- libavfilter: pemrosesan media mentah melalui filter berbasis graf
- libavdevice: dukungan perangkat input/output
- libavutil: menyediakan utilitas multimedia umum
- libswresample: mendukung resampling audio, konversi format sampel, dan mixing audio
- libswscale: fungsi konversi warna dan penskalaan gambar
- libpostproc: fungsi post-processing video (deblocking, filter noise, dll.)
Pemutar sederhana FFmpeg
- Cara dasar penggunaan FFmpeg adalah melakukan demux pada stream multimedia untuk memisahkannya menjadi stream audio dan video, lalu mendekodenya menjadi data audio/video raw
-
Struktur utama
- AVFormatContext: struktur tingkat atas yang mengelola sinkronisasi stream, metadata, dan muxing
- AVStream: stream audio atau video yang berkelanjutan
- AVCodec: mendefinisikan metode encoding dan decoding data
- AVPacket: data terenkode di dalam stream
- AVFrame: frame video mentah atau sampel audio hasil decoding
-
Proses analisis stream dan demux
- Alokasi memori AVFormatContext dengan
avformat_alloc_context()
- Membuka file multimedia dengan
avformat_open_input()
- Menganalisis informasi stream di dalam file dengan
avformat_find_stream_info()
- Menampilkan time base, frame rate, waktu mulai, durasi, tipe, dan kode FourCC dari tiap stream
- Menutup file dan membebaskan memori dengan
avformat_close_input()
-
Pencarian dan inisialisasi codec
- Mencari decoder yang sesuai dengan codec ID dari AVStream menggunakan
avcodec_find_decoder()
- Untuk stream video, menampilkan resolusi (width, height); untuk stream audio, menampilkan jumlah channel dan sample rate
- Membuat AVCodecContext dengan
avcodec_alloc_context3()
- Menerapkan parameter codec stream ke context decoder dengan
avcodec_parameters_to_context()
- Membuka decoder dengan
avcodec_open2()
-
Membaca packet dan decoding
- Mengalokasikan struktur
AVPacket dan AVFrame masing-masing untuk menyimpan packet terenkode dan frame hasil decode
- Membaca packet secara berurutan dari file input dengan
av_read_frame()
- Mengidentifikasi stream asal packet melalui stream_index
- Hanya mengirim packet dari stream video yang dipilih (
first_video_stream_index) ke decoder
- Mengirim packet ke decoder dengan
avcodec_send_packet()
- Menerima frame hasil decode berulang kali dengan
avcodec_receive_frame()
- Menampilkan nomor, tipe(I/P/B), format, PTS, dan apakah keyframe untuk tiap frame
- Mendaur ulang memori packet dengan
av_packet_unref()
- Setelah semua proses selesai, membebaskan memori dengan
av_packet_free(), av_frame_free(), avcodec_free_context(), avformat_close_input()
-
Contoh eksekusi dan hasil
- Kode contoh tersedia di repositori GitHub
- Dapat dibangun menggunakan meson dan ninja (
pip3 install meson ninja)
- Menjalankan
meson setup build akan mengunduh dan mengonfigurasi FFmpeg secara otomatis
- Setelah build dengan
ninja -C build, jalankan dengan ./build/ffmpeg-101 sample.mp4
- Hasil eksekusi menampilkan format file, informasi stream (video/audio), codec, resolusi, sample rate, PTS tiap packet, dan informasi frame hasil decode
-
Ringkasan contoh output
- Stream video: H.264 (avc1), resolusi 206x80, frame rate 30fps
- Stream audio: AAC (mp4a), 2 channel, 44.1kHz
- PTS tiap packet dan tipe frame (I/P) ditampilkan secara berurutan, dan proses decoding dicetak ke konsol
Lingkungan build dan eksekusi
- Alat yang dibutuhkan: Python, pip, meson, ninja
- Perintah instalasi:
pip3 install meson ninja
-
Prosedur build
- Ekstrak file arsip contoh ke folder
ffmpeg-101
- Jalankan
meson setup build
- Build dengan
ninja -C build
- Jalankan dengan
./build/ffmpeg-101 sample.mp4
- Jika FFmpeg belum terpasang di sistem, FFmpeg akan diunduh dan dikonfigurasi secara otomatis
1 komentar
Komentar Hacker News
Sangat merekomendasikan tutorial Leandro Moreira bagi siapa pun yang ingin memahami cara kerja internal FFmpeg dan libav secara mendalam
Secara pribadi, ini adalah penjelasan paling lengkap dan paling jelas yang pernah saya lihat sejauh ini
Tautan tutorial FFmpeg-libav
Agak mengejutkan ini sudah ffmpeg 101. Rasanya seperti ffmpeg 8 baru keluar kemarin
Membagikan panduan lain
Tautan panduan terkait di HN
FFmpeg benar-benar alat yang sangat saya sukai
Ini adalah materi pengantar ffmpeg yang luar biasa. Terima kasih
ffmpeg adalah superpower sejati
Saya selalu memakainya saat merakit beberapa potongan video menjadi satu bentuk yang bisa diputar