11 Oct 2020

Apa itu ffmpeg dan manipulasi video

ffmpeg tips

Saya sendiri on/off soal procedural generation app, saya sebenernya suka sekali ngulik - ngulik video/grafis generation walaupun belum banyak yang bisa saya share. Tulisan berikut mungkin berantakan (karena lebih seperti note, daripada tulisan), tujuan dari tulisan berikut adalah mengenalkan ffmpeg secepat mungkin dengan beberapa contoh perintah.

ffmpeg dikenal sebagai satu - satunya perangkat lunak terbuka manipulasi video terlengkap. Proyek ffmpeg ini dirilis sebagai perangkat lunak terbuka pada tahun 2000, dan terus dikembangkan sampai sekarang. Mungkin banyak yang mengenal ffmpeg dengan kompresi video-nya - tapi banyak juga kok perintah - perintah, pada ffmpeg ini yang memungkinkan kita untuk membuat video editor.

Installasi / Pemasangan #

Saya suka menggunakan ffmpeg static build download saja dan tinggal taruh folder bin atau symlink. Untuk platform lain silahkan untuk menuju dokumentasi resmi.

Untuk windows

# untuk linux cara symlink
$ ln -s ~/path/to/downloaded/build/ffmpeg ~/.local/bin/
# setelah itu tinggal diakses dengan, ingat taruh di bin agar dapat diakses secara global
$ ffmpeg

Jangan lupa juga ffprobe, dan ffplay sekalian dipasang.

Untuk nodejs saya sering menggunakan ffmpeg-static

Cara baca command #

Perintah dibawah digunakan untuk merubah video .mp4 ke .webm. ffmpeg akan otomatis akan menggunakan konfigurasi default (enconding, bitrate, dkk) dan mengkonversi jenis video ke .webm

$ ffmpeg -i input.mp4 output.avi

Perintah dibawah adalah perintah untuk mengkompresi video dan merubah encoding menjadi webm.

$ ffmpeg -i source.mp4 -c:v libvpx-vp9 -b:v 1M -c:a libopus -b:a 128k target.webm

Nah untuk perintah kedua ini mari kita pecah satu - satu, agar lebih jelas.

  1. -i source.mp4 Ini digunakan untuk mengambil input video
  2. -c:v opsi ini c untuk codec dan v untuk video (bagian codec akan saya jelaskan nanti)
  3. -b:v b disini adalah video bitrate (akan saya jelaskan dibawah)
  4. -c:a dan -b:a sama seperti diatas tapi ini untuk audio

ffmpeg selain bisa menformat Video bisa juga digunakan untuk memformat Audio. Jadi kita bisa optimisasikan sebuah Video baik itu melalui Audio bitrate maupun Video. Bagian berikutnya lagi saya akan mendemokan soal complex filter dan buffer chaining di ffmpeg.

ffmpeg Complex Filter #

                [main]
input --> split ---------------------> overlay --> output
| ^
|[tmp] [flip]|
+-----> crop --> vflip -------+

Nuaah ~ sampe sini nih, menurut saya ini adalah bagian menarik dari ffmpeg, filter. Filter pada ffmpeg dapat digunakan pada file gambar maupun video. Filter pada ffmpeg dapat menggunakan buffer chaining yang artinya kita dapat menggabungkan 2 atau lebih proses filter pada ffmpeg. Berikut adalah diagram yang ada pada dokumentasi. Silahkan download video berikut dan jalankan command ffmpeg dibawah untuk mempraktekkan, dengan contoh command pada dokumentasi.

$ ffmpeg -i input.mp4 -vf "split [main][tmp]; [tmp] crop=iw:ih/2:0:0, vflip [flip]; [main][flip] overlay=0:H/2" output.mp4

Diagram diatas menjelaskan bahwa proses pada ffmpeg dapat dibagi beberapa buah. Menggunankan libavfilter filter pada ffmpeg dapan menerima banyak output dan menghasilkan banyak output pula. Ini adalah konsep buffer chaining yang ingin saya tekankan, karena konsep ini sangat berguna untuk video processing maupun video prosedural generatif. Mari kita pecah satu persatu.

Input video dimasukan kedalam proses split, menghasilakn 2 buffer. satu dinamakan [main] satu lagi [tmp], [tmp] melalui proses crop di potong video-nya, lalu dibalik (diputer 180') dengan vflip menghasilkan output [flip]. Kedua [main] dan [flip] yang dihasilkan lalu digabung menggunakan overlay, dengan aturan setengah dari tinggi video tersebut. Mari kita lihat hasil dari perintah tersebut.

image result

iw input width. ih input heigt. iw:ih/x:y:keep_aspect memotong video berdasarkan posisi, keep_aspect untuk menentukan aspect ratio dari sebuah video. 0:H/2, dalam overlay tempatkan input overlay ke-setengah tinggi dari video tujuan

Chroma Key #

Biasa dikenal seperti Green Screen Keying, sebuah proses penghapusan warna dari video - warna tersebut lalu dapat diganti dengan hal lain - seperti background video atau yang lainnya. Berikut contoh perintah dan penjelasan.

$ ffmpeg -i <base-video> -i <overlay-video> -filter_complex '[1:v]colorkey=0x<color>:<similarity>:<blend>[ckout];[0:v][ckout]overlay[out]' -map '[out]' <output-file>

Contoh hasil, bisa lihat di tweet saya. Nah, kita bisa memakai overlay-video ataupun memakai overlay-gambar dengan ekstensi .png atau .jpeg/jpg.

Baris pertama [1:v]colorkey=0x<color>:<similarity>:<blend>[ckout]; nuaaaah, [1:v] mengakses video greenscreen hapus warna (saya memakai 0x3BBD1E) hijaunya, lalu mengeluarkan output [ckout].

Baris kedua [0:v][ckout]overlay[out], nah karena pada ffmpeg, ditaruh pertama maka akan di proses duluan. Perintah berikut dapat diartiakn menaruh [ckout] (video green screen wanita) diatas [0:v] (background_hacktoberfest.png) dan menghasilkan output [out].

Penggunaan -map [out] output-file.mp4 adalah memilih hasil output mana yang harus diikutkan ke dalam file final.

.mov merupakan ekstensi video yang bisa transparan, seperti .png dan .webp kalau dalam konteks grafis

Bitrate, Framerate, dan Encoding #

Bitrate, pada ffmepg bitrate dimaksudkan adalah seberapa banyak bits (byte) yang diproses oleh FFMPEG dalam satu waktu, semakin besar bitrate semakin besar pula ukuran file. Dalam ffmpeg opsi ini biasanya dipanggil dengan -b.

Framerate (FPS-Frame per second), semakin tinggi Framerate maka semakin halus pergerakan di sebuah video, semakin tinggi juga mempengaruhi size video. Kebanyakan video sudah bagus ditayangkan di 30FPS.

Encoding, dalam ffmpeg bisa dikatakan adalah sebuah proses untuk mengubah format file, contoh dari mp4 ke webp. Ffmpeg mempunya buaaaaanyaaak sekali codecs ~ yang saya sendiri jarang pakai haha. Bisa dilihat di sini.

ffprobe dan ffplay #

ffprobe, biasanya digunakan untuk mengambil dan mengubah metadata pada sebuah video, seperti judul, tanggal, dan yang lain.

ffplay, media player praktis dari ffmepg.

Sumber belajar #