Menggunakan FFMPEG

FFMPEG adalah aplikasi command line untuk mengolah file video dan audio. Sering disebut orang sebagai swiss army of audio video karena serba guna dan segala bisa. Saya juga menggunakan ffmpeg untuk mengolah berbagai file video dan audio. Sekali kita menguasai opsi-opsinya, atau punya cheatsheet untuk berbagai situasi, kita tinggal copas saja perintahnya pada waktu dibutuhkan.

Buat mereka yang tidak ingin berurusan dengan command line, bisa juga menggunakan Handbrake, QWinFF, atau ShutterEncoder. Tapi kalau saya pribadi sih, lebih suka pakai command line saja.

Berikut adalah beberapa kegunaan dan perintah FFMPEG yang sering saya gunakan.

Merekam Screen

Pengguna MacOS sebenarnya bisa juga menggunakan Quicktime Player untuk merekam. Saya dulu juga pakai itu. Keunggulannya, dia sudah ada di MacOS sehingga kita tidak perlu menginstal aplikasi lain lagi. Kelemahannya, kalau kita set folder tujuan, maka ketika kita mengambil screenshot (untuk keperluan lain), maka folder tujuannya akan ikut pindah ke folder tujuan hasil screencast. Cukup menyebalkan. Jadi, sekarang saya pakai ffmpeg saja.

Pertama, kita cari tau dulu nama device yang akan kita gunakan untuk merekam. Perintahnya sebagai berikut:

ffmpeg -f avfoundation -list_devices true -i ""

Outputnya seperti ini

[AVFoundation indev @ 0x138604340] AVFoundation video devices:
[AVFoundation indev @ 0x138604340] [0] FaceTime HD Camera
[AVFoundation indev @ 0x138604340] [1] Capture screen 0
[AVFoundation indev @ 0x138604340] AVFoundation audio devices:
[AVFoundation indev @ 0x138604340] [0] Microsoft Teams Audio
[AVFoundation indev @ 0x138604340] [1] MacBook Pro Microphone
[AVFoundation indev @ 0x138604340] [2] Jabra MOVE v2.5.0

Ini menandakan bahwa ffmpeg berhasil menemukan perangkat video berikut:

  • FaceTime HD Camera : webcam laptop saya
  • Capture screen 0 : layar laptop

dan perangkat audio berikut:

  • Microsoft Teams Audio : audio driver yang diinstal aplikasi MS Teams
  • MacBook Pro Microphone : mic bawaan laptop
  • Jabra MOVE v2.5.0 : headset bluetooth saya yang kebetulan sedang terkoneksi

Setelah kita mendapatkan perangkatnya, kita bisa melakukan perekaman layar (video device index 1) dengan mengambil audio dari mic laptop (audio device index 1), dengan perintah berikut

ffmpeg -f avfoundation -i "1:1" recording-`date +%Y%m%d%H%M%S`.mkv

Sepengalaman saya, file yang dihasilkan, yaitu output.mkv, ukurannya kecil. Akan tetapi berat untuk diproses di Davinci Resolve. Entah apa encodingnya, saya lupa mengecek. Untuk itu, kita transcode dulu ke H264 dengan perintah berikut:

ffmpeg -i output.mkv -c:v h264_videotoolbox -c:a aac_at `date +%Y%m%d%H%M%S`-recording.mov

Atau kita bisa juga langsung record dengan encoding H264 sehingga tidak perlu konversi, dengan perintah berikut:

ffmpeg -f avfoundation -i "1:0" -c:v h264_videotoolbox -c:a aac_at `date +%Y%m%d%H%M%S`-recording.mov

Bila kita juga mengambil footage dengan kamera, biasanya kita ingin menyesuaikan frame rate rekaman screen dengan rekaman kamera, sehingga nantinya mudah untuk disinkronisasi pada saat pengeditan. Misalnya kamera kita menggunakan 50fps, maka kita gunakan opsi -framerate 50 seperti ini

ffmpeg -f avfoundation -framerate 60 -i "1:0" -c:v h264_videotoolbox -c:a aac_at `date +%Y%m%d%H%M%S`-recording.mov

Sebetulnya kita juga bisa mengatur ukuran screencastnya dengan opsi -video_size 1920x1080. Akan tetapi saya belum coba, jadi belum tau apa efeknya apabila aspect ratio layar komputer kita bukan 16:9. Bisa jadi dicrop, atau di-stretch.

Melihat Metadata File

Untuk melihat informasi tentang unsur audio dan video dalam suatu file, kita gunakan perintah ffprobe yang merupakan bagian dari aplikasi ffmpeg. Berikut contohnya

ffprobe konsep-git-5.mov 

Outputnya seperti ini

ffprobe version 7.1 Copyright (c) 2007-2024 the FFmpeg developers
  built with Apple clang version 16.0.0 (clang-1600.0.26.4)
  configuration: --prefix=/opt/homebrew/Cellar/ffmpeg/7.1_3 --enable-shared --enable-pthreads --enable-version3 --cc=clang --host-cflags= --host-ldflags='-Wl,-ld_classic' --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libaribb24 --enable-libbluray --enable-libdav1d --enable-libharfbuzz --enable-libjxl --enable-libmp3lame --enable-libopus --enable-librav1e --enable-librist --enable-librubberband --enable-libsnappy --enable-libsrt --enable-libssh --enable-libsvtav1 --enable-libtesseract --enable-libtheora --enable-libvidstab --enable-libvmaf --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libspeex --enable-libsoxr --enable-libzmq --enable-libzimg --disable-libjack --disable-indev=jack --enable-videotoolbox --enable-audiotoolbox --enable-neon
  libavutil      59. 39.100 / 59. 39.100
  libavcodec     61. 19.100 / 61. 19.100
  libavformat    61.  7.100 / 61.  7.100
  libavdevice    61.  3.100 / 61.  3.100
  libavfilter    10.  4.100 / 10.  4.100
  libswscale      8.  3.100 /  8.  3.100
  libswresample   5.  3.100 /  5.  3.100
  libpostproc    58.  3.100 / 58.  3.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'konsep-git-5.mov':
  Metadata:
    major_brand     : qt  
    minor_version   : 512
    compatible_brands: qt  
    encoder         : Lavf61.7.100
  Duration: 00:02:09.99, start: 0.000000, bitrate: 5117 kb/s
  Stream #0:0[0x1]: Video: h264 (High) (avc1 / 0x31637661), yuv420p(progressive), 2880x1800, 5005 kb/s, 29.98 fps, 30 tbr, 1000k tbn (default)
      Metadata:
        handler_name    : VideoHandler
        vendor_id       : FFMP
        encoder         : Lavc61.19.100 h264_videotoolbox
  Stream #0:1[0x2]: Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, mono, fltp, 106 kb/s (default)
      Metadata:
        handler_name    : SoundHandler
        vendor_id       : [0][0][0][0]

Dari output di atas, kita bisa mendapatkan informasi:

Video

  • Encoding : h264
  • Resolusi : 2880x1800
  • Frame rate : 29.98fps

Audio

  • Encoding : aac
  • Sampling rate : 4.8 kHz
  • Channel : mono

Contoh lain, dari kamera Sony A7III

ffprobe C0008.MP4

Outputnya seperti ini

ffprobe version 7.1 Copyright (c) 2007-2024 the FFmpeg developers
  built with Apple clang version 16.0.0 (clang-1600.0.26.4)
  configuration: --prefix=/opt/homebrew/Cellar/ffmpeg/7.1_3 --enable-shared --enable-pthreads --enable-version3 --cc=clang --host-cflags= --host-ldflags='-Wl,-ld_classic' --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libaribb24 --enable-libbluray --enable-libdav1d --enable-libharfbuzz --enable-libjxl --enable-libmp3lame --enable-libopus --enable-librav1e --enable-librist --enable-librubberband --enable-libsnappy --enable-libsrt --enable-libssh --enable-libsvtav1 --enable-libtesseract --enable-libtheora --enable-libvidstab --enable-libvmaf --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libspeex --enable-libsoxr --enable-libzmq --enable-libzimg --disable-libjack --disable-indev=jack --enable-videotoolbox --enable-audiotoolbox --enable-neon
  libavutil      59. 39.100 / 59. 39.100
  libavcodec     61. 19.100 / 61. 19.100
  libavformat    61.  7.100 / 61.  7.100
  libavdevice    61.  3.100 / 61.  3.100
  libavfilter    10.  4.100 / 10.  4.100
  libswscale      8.  3.100 /  8.  3.100
  libswresample   5.  3.100 /  5.  3.100
  libpostproc    58.  3.100 / 58.  3.100
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x11e605b20] st: 0 edit list: 1 Missing key frame while searching for timestamp: 1000
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x11e605b20] st: 0 edit list 1 Cannot find an index entry before timestamp: 1000.
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'C0008.MP4':
  Metadata:
    major_brand     : XAVC
    minor_version   : 16785407
    compatible_brands: XAVCmp42iso2
    creation_time   : 2024-11-20T07:41:23.000000Z
  Duration: 00:02:20.64, start: 0.000000, bitrate: 51776 kb/s
  Stream #0:0[0x1](und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709/bt709/iec61966-2-4, progressive), 1920x1080 [SAR 1:1 DAR 16:9], 49609 kb/s, 50 fps, 50 tbr, 50k tbn (default)
      Metadata:
        creation_time   : 2024-11-20T07:41:23.000000Z
        handler_name    : Video Media Handler
        vendor_id       : [0][0][0][0]
        encoder         : AVC Coding
  Stream #0:1[0x2](und): Audio: pcm_s16be (twos / 0x736F7774), 48000 Hz, 2 channels, s16, 1536 kb/s (default)
      Metadata:
        creation_time   : 2024-11-20T07:41:23.000000Z
        handler_name    : Sound Media Handler
        vendor_id       : [0][0][0][0]
  Stream #0:2[0x3](und): Data: none (rtmd / 0x646D7472), 409 kb/s (default)
      Metadata:
        creation_time   : 2024-11-20T07:41:23.000000Z
        handler_name    : Timed Metadata Media Handler
        timecode        : 09:30:18:38
Unsupported codec with id 0 for input stream 2

Informasi yang kita dapatkan:

Video

  • Encoding : h264
  • Resolusi : 1920x1080
  • Frame rate : 50fps

Audio

  • Encoding : pcm_s16be
  • Sampling rate : 4.8 kHz
  • Channel : mono

Mengubah Frame Rate

Berikut perintah untuk mengubah frame rate dari 29.98fps menjadi 50fps

ffmpeg -i konsep-git-5.mov -filter:v fps=50 konsep-git-5-50fps.mov

Konversi untuk Whatsapp

Di tahun 2024 ini, saya masih banyak menggunakan kamera betulan, yaitu Nikon ZFC. Kualitas hasil, pilihan lensa, dan kontrol manualnya jauh lebih enjoyable digunakan daripada kamera hape. Setelah itu kita bisa mentransfer hasilnya dengan mudah menggunakan koneksi bluetooth atau wifi ke smartphone. Sehingga bisa langsung dishare. Akan tetapi, kadang saya juga perlu mengirim file video melalui laptop. Untuk itu, file dari kamera perlu dikecilkan terlebih dulu. Berikut perintahnya

ffmpeg -i DSC_3120.MOV -filter:v scale=480:-1 -c:v libx264 -c:a aac output.mp4

Atau bila kita tidak perlu suaranya, bisa kita hilangkan seperti ini

ffmpeg -i DSC_3120.MOV -filter:v scale=480:-1 -c:v libx264 -an output.mp4

Videonya saya resize menjadi 480p karena di hape toh layarnya kecil. Tidak perlu resolusi besar. Kirim file besarpun nanti akan dikompresi oleh whatsapp

Konversi untuk Instagram

File dari kamera biasanya horizontal dengan aspect ratio 16:9. Sedangkan Instagram formatnya vertikal dengan aspect ratio 9:16. Untuk mengkonversi video horizontal menjadi vertikal, berikut perintahnya

ffmpeg -i input.mp4 -vf 'scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2,setsar=1' output.mp4

Perintah di atas akan mengkonversi aspect ratio dan menambahkan black bar sebagai padding.

Bila kita ingin paddingnya berupa efek blur dari video asli, berikut perintahnya

ffmpeg -i input.mp4 -filter_complex "[0:v]scale=256/81*iw:256/81*ih,boxblur=luma_radius=min(h\,w)/40:luma_power=3:chroma_radius=min(cw\,ch)/40:chroma_power=1[bg];[bg][0:v]overlay=(W-w)/2:(H-h)/2,setsar=1,crop=w=iw*81/256" output-vertical.mp4

Atau ini

ffmpeg -i input.mp4 -filter_complex '[0:v]scale=ih*16/9:-1,boxblur=luma_radius=min(h\,w)/20:luma_power=1:chroma_radius=min(cw\,ch)/20:chroma_power=1[bg];[bg][0:v]overlay=(W-w)/2:(H-h)/2,crop=h=iw*9/16' output-horizontal.mp4

Extract Audio

Jaman sekarang, banyak video kajian agama dan juga podcast di Youtube. Video seperti ini sebetulnya tidak perlu dilihat layarnya. Kita cuma butuh suaranya untuk kita dengarkan sambil olahraga atau selama di jalan menuju kantor. Untuk mengambil audio saja dari video, kita gunakan perintah berikut

ffmpeg -i video.mkv -vn -acodec libmp3lame audiofile.mp3

Membuat file GIF dari Video

Berikut perintahnya

ffmpeg -i input.mp4 -filter_complex "[0:v] fps=1,scale=w=480:h=-1,split [a][b];[a] palettegen=stats_mode=single [p];[b][p] paletteuse=new=1" output.gif

Atau bisa juga menggunakan perintah ini

ffmpeg -i input.mp4 -vf "fps=10,scale=320:-1:flags=lanczos" -c:v gif animation.gif

Resize

Bila filenya terlalu besar, kita bisa kompresi lagi. Untuk podcast/kajian, yang terpenting adalah vokalnya jernih dan jelas. Tidak perlu seluruh spektrum frekuensi tampil maksimal. Berikut perintahnya

ffmpeg -i input.mp3 -map 0:a:0 -b:a 48k output.mp3 

Trim

Kadangkala, kita ingin memotong video/audio di menit sekian (starting point) sepanjang sekian menit (durasi). Perintahnya untuk file audio sebagai berikut

ffmpeg -ss 30 -t 70 -i input.mp3 -acodec copy outputfile.mp3

atau ini untuk video

ffmpeg -ss 00:02:30 -t 00:00:25 -i VID00006.AVI -filter:v scale=480:-1 -c:v libx264 -an  output.mp4

Penjelasan opsi:

  • -ss : starting point dengan format HH:mm:ss
  • -t : durasi file yang ingin dihasilkan
  • -i : nama file input
  • -acodec copy : bagian audio tetap menggunakan codec asli, tidak perlu transcoding
  • -filter:v scale=480:-1 : kalau mau diresize jadi 480p
  • -c:v libx264 : kalau mau ubah encoding menjadi H264
  • -an : menghilangkan audio

Menggabungkan Video

Misalnya kita memiliki beberapa file video yang mau kita gabung menjadi satu file. Kita bisa membuat file text berisi nama-nama file video tersebut, untuk kemudian diproses oleh ffmpeg. Bila nama filenya berurutan, kita tinggal jalankan perintah berikut

for f in *.mov; do echo "file '$f'" >> daftar-file.txt; done

Sehingga dia menghasilkan file yang isinya seperti ini

file 'file1.mov'
file 'file2.mov'
file 'file3.mov'

Kemudian kita proses dengan perintah berikut

ffmpeg -f concat -safe 0 -i daftar-file.txt -aspect 16:9 -c:v h264_videotoolbox -c:a libmp3lame `date +%Y%m%d`.mp4

Atau seperti ini bila kita tidak ingin mengubah encoding

ffmpeg -f concat -safe 0 -i daftar-file.txt -c:v copy -c:a copy `date +%Y%m%d`.mp4

Mengubah Aspect Ratio

Berikut adalah perintah untuk mengkonversi video dengan aspect ratio 4:3 menjadi 16:9

ffmpeg -i 2021071102.mp4 -aspect 16:9 -c:v libx264 -c:a copy 2021071102-fixed.mp4

Bila filenya banyak, dan sudah ada daftar file, jalankan perintah berikut

for f in *.mov; do ffmpeg -i "$f" -aspect 16:9 -c:v libx264 -c:a copy "${f%%.mov}-169".mp4; done

Konversi untuk TV Sony

Adakalanya kita mendapatkan file video yang tidak bisa dijalankan di TV. Ini biasanya disebabkan karena codec yang tidak didukung oleh merek TV tersebut. Berikut adalah perintah yang saya gunakan supaya file video bisa dijalankan di TV Sony saya. Perhatikan bahwa beda TV beda juga dukungan codecnya. Silahkan modifikasi codecnya supaya sesuai dengan dukungan di TV Anda.

ffmpeg -i input.mkv -c:a copy -c:v libx264 -profile:v main -pix_fmt yuv420p output.mkv

Bila video tersebut ada subtitlenya, berikut perintahnya

ffmpeg -i input.mkv -filter_complex "subtitles=input.mkv" -c:a copy output.mp4

Atau bila kita ingin mengeluarkan subtitlenya ke file terpisah, jalankan perintah berikut

ffmpeg -i input.mkv -map 0:s:0 output.srt

Demikianlah beberapa command ffmpeg yang sering saya gunakan. Bila nanti ada tambahan, artikel ini akan saya update.