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.