Belajar FFmpeg lewat Contoh
(ffmpegbyexample.com)- Operasi FFmpeg mudah menjadi rumit karena kombinasi opsinya, dan FFmpeg By Example adalah situs dokumentasi yang membantu Anda cepat menemukan cara pemrosesan media yang dibutuhkan melalui contoh perintah nyata
- Situs ini juga menyediakan repositori GitHub, komunitas Discord, dan halaman kontribusi, sehingga pengguna dapat mengirimkan sendiri ide pemanfaatan FFmpeg baru
- Seperti contoh filter
testsrc, situs ini menampilkan sumber input, resolusi, frame rate, dan file output dalam satu perintah, sehingga struktur perintahnya bisa langsung diikuti - Contohnya mencakup berbagai pekerjaan pemrosesan media, seperti perhitungan bitrate, resize gambar, pengurangan noise audio, efek transisi, stream mapping, akselerasi hardware, dan penanganan metadata
- Setiap contoh dipisahkan dengan tag dan halaman tersendiri, sehingga mudah menelusuri perintah FFmpeg yang dibutuhkan berdasarkan filter tertentu atau tujuan konversi
Situs dokumentasi FFmpeg berbasis contoh
- FFmpeg By Example adalah situs web yang merangkum berbagai cara menggunakan FFmpeg dalam unit contoh
- Situs ini juga menyediakan tautan untuk partisipasi komunitas dan kontribusi
Contoh membuat video uji dengan testsrc
- Generate test video color pattern with 'testsrc' filter adalah contoh membuat video pola warna untuk pengujian dengan filter
testsrc - Perintahnya membuat video 10 detik, 1280x720, 30fps sebagai
testsrc.mpgdengan input lavfi
ffmpeg -f lavfi -i testsrc=duration=10:size=1280x720:rate=30 testsrc.mpg
Encoding, konversi, dan akselerasi hardware
- Termasuk contoh terkait encoding video dan konversi format
- Recode Your Video With a Modern Codec, Often Saving Space: contoh terkait encoding H.265
- Convert Video to Telegram Video Sticker Format (512px Max, 256KB Limit): contoh konversi ke format stiker video Telegram
- Use Intel QuickSync Video Hardware Acceleration for Transcoding Video: contoh transcoding dengan akselerasi hardware Intel QuickSync Video
Pemrosesan audio
- Anda dapat melihat contoh pekerjaan audio yang sering digunakan, seperti penghilangan noise, normalisasi, konversi, dan ekstraksi
- Audio Noise Reduction Using Arnndn: pengurangan noise audio menggunakan
arnndn - Normalize Audio to EBU R128 Loudness Standard (-23 LUFS): normalisasi ke standar EBU R128
-23 LUFS - Convert Wav to Mp3 File: mengonversi WAV ke MP3
- Extract an AAC Audio Track From a Video File: mengekstrak track audio AAC dari file video
- Audio Noise Reduction Using Arnndn: pengurangan noise audio menggunakan
Gambar dan animasi
- Juga mencakup workflow berbasis gambar, mulai dari pemrosesan gambar statis hingga pembuatan animasi WebP
- Resize PNG Images While Preserving Transparency and Aspect Ratio: resize PNG sambil mempertahankan transparansi dan rasio aspek
- Generate Looping WebP Animation From Image Sequence With Variable Quality: membuat animasi WebP berulang dari rangkaian gambar
- Slow Animated WebP Image Sequence (Carousel): contoh rangkaian gambar WebP animasi lambat
Filter dan efek visual
- Tersusun contoh animasi, transisi, dan efek teks menggunakan filter FFmpeg
- Animate an Image Using Zoompan Filter: membuat animasi gambar dengan filter
zoompan - XFade Video Transitions Examples: efek transisi berbasis
xfade - Video Echo Effect With Delay and Hue Using Lagfun: efek echo video dengan delay dan perubahan warna menggunakan
lagfun - Fade in and Out Text Using the 'Drawtext' Filter: fade in/out teks dengan filter
drawtext - "Drawtext" and "Drawbox" Using "Sendcmd" Manifest: menggunakan
drawtextdandrawboxdengan manifessendcmd
- Animate an Image Using Zoompan Filter: membuat animasi gambar dengan filter
Ekstraksi, analisis, dan metadata
- Termasuk juga pekerjaan mengambil stream yang dibutuhkan dari file atau menganalisis frame dan metadata
- Extract Audio From Video Files With Stream Mapping: mengekstrak audio dari file video dengan stream mapping
- Extract Multiple Video Clips From Single Input With Precise Timestamps: mengekstrak beberapa klip dari satu input dengan timestamp presisi
- Analyze Video Frames, Timecode and Metadata With Showinfo Filter: menganalisis frame, timecode, dan metadata dengan filter
showinfo - Getting Streams Information of a Video File: memeriksa informasi stream pada file video
- Copy Metadata From One Mp3 to Another: menyalin metadata antar-MP3
Sumber generatif dan pipe output
- Juga menyediakan contoh yang berguna untuk otomatisasi atau debugging, seperti pembuatan sumber uji, perekaman frame individual, dan output ke STDOUT
- Generate Solid Color Video With Custom Hex Color Code: membuat video warna solid dengan kode warna Hex kustom
- Create SMPTE Color Bars With Centered Text Overlay: membuat color bar SMPTE dengan overlay teks di tengah
- Generate "Game of Life" Video Using Lavfi Video Source: membuat video Game of Life dengan sumber video
lavfi - Print a Data Channel to STDOUT Using Ffmpeg: mencetak data channel ke STDOUT
- Record a Video From Individual Frames: merekam video dari frame individual
1 komentar
Opini Hacker News
Kesenangan memakai ffmpeg meningkat 1000%
Dulu saya bosan mencari jawaban Stack Overflow lewat Google lalu merangkainya jadi perintah, tapi sekarang ChatGPT menuliskan perintahnya untuk saya jadi jauh lebih nyaman
Berkat LLM, saya memakai ffmpeg beberapa kali seminggu
Ini adalah penggunaan terbaik untuk alat
llm cmdsaya:uv tool install llmllm install llm-cmdllm cmd use ffmpeg to extract audio from myfile.mov and save that as mp3https://github.com/simonw/llm-cmd
Sudah lama saya menempatkan ffmpeg di kotak yang sama dengan regex: “saya benar-benar harus mempelajarinya, tapi rasanya saya akan sangat membencinya”
Lalu ChatGPT muncul dan menyelesaikan keduanya
Saya juga sama. Hal seperti ini sudah sepenuhnya diambil alih AI, dan saya cuma perantara yang menyalin-tempel pelacakan error
Banyak alat lain juga sudah muncul, tapi saya baru saja membuat skrip yang cukup menyederhanakan rantai perintah seperti ini: llmpeg https://github.com/jjcm/llmpeg
Seharusnya langsung berjalan jika ffmpeg sudah terpasang dan API key variabel lingkungan OpenAI sudah disetel
Demo: https://image.non.io/1c7a92ef-0917-49ef-9460-6298c7a9116c.we...
Setelah memahami cara kerja filter kompleks, pengalaman saya memakai ffmpeg jadi lebih baik
Saya jadi terpikir bahwa saya harus merapikan dan mempublikasikan cara mengubah kaset video rumahan yang sudah didigitalkan menjadi klip dengan deteksi adegan
Kalau-kalau ada yang mencarinya, saya meninggalkan gist [0] yang bekerja cukup baik. Namun kadang ia tertipu oleh flash kamera atau guncangan, jadi saya harus memberi file awal/akhir terpisah lalu menyambungkannya lagi dengan ffmpeg [1]
Yang aneh, pada update Mac terbaru performanya justru lebih baik tanpa
-c:v h264_videotoolbox. Mungkin ini regresi performa di Sequoia, tapi saya tidak yakin. Flag yang setara di mesin Windows dengan GPU Nvidia adalah-c:v h264_nvenc. Saya penasaran kenapa ffmpeg tidak mendeteksinya secara otomatis. Dengan ini saya mendapat sekitar peningkatan performa 8xSatu-satunya momen di kantor ketika saya benar-benar terasa layak digaji adalah saat saya menyadari bahwa ffmpeg yang terpasang dikompilasi tanpa akselerasi GPU, tepat ketika mereka hendak mengeluarkan biaya lebih untuk server cloud ber-GPU demi pemrosesan video
[0] https://gist.githubusercontent.com/nielsbom/c86c504fa5fd61ae...
[1] https://gist.githubusercontent.com/jazzyjackson/bf9282df0a40...
Masalah dengan CPU cloud adalah tidak adanya encoder video hardware yang ada di CPU konsumen, jadi Anda harus naik ke mesin GPU yang jauh lebih mahal
Sejujurnya saya belum pernah membandingkan harga secara serius dengan memakai akselerasi hardware di cloud, jadi saya penasaran apakah maksudnya Anda benar-benar sudah mencobanya dan hasil biaya vs manfaatnya cukup layak
Saya pernah mencoba deteksi adegan kosong dengan ffmpeg
Ada kamera yang mengarah ke jalur penerbangan SFO, dan setelah semua frame tanpa gerakan dihapus, yang tersisa hanyalah rangkaian video kontinu saat pesawat melintas tanpa bagian membosankan
-c:v h264_nvencberguna untuk batch encoding banyak video sekaligus. Karena throughput encoding bisa lebih tinggiNamun dari eksperimen terbatas yang pernah saya lakukan dulu, kualitas output-nya sedikit lebih buruk daripada libx264. Saya tidak tahu apakah ada cara mengatasinya, tapi ini bukan hanya saya yang mengalaminya
Alasan ffmpeg tidak mendeteksi ini secara otomatis adalah karena encoding hardware biasanya punya rentang pengaturan yang lebih sempit dan komprominya lebih besar dibanding codec software yang lebih canggih, serta tidak selalu menghasilkan keluaran yang persis sama bahkan dengan parameter yang sama
Selain itu, sering kali ada beberapa API hardware yang bisa dipilih di sistem, dan kemampuannya juga berbeda-beda
FFmpeg adalah alat command line yang kompleks dan ditujukan untuk pengguna yang mau mempelajari detailnya, jadi saya tidak yakin menetapkan default berdasarkan asumsi adalah pilihan yang tepat
Dari snippet-nya, sepertinya tidak ada deinterlace
Jika klip sebelum didigitalkan memang sudah di-deinterlace, tidak masalah, tetapi jika tidak, berarti Anda merusak kualitas materi interlaced dengan mengenkodenya sebagai progressive. Sebaiknya tambahkan filter
bwdifagar konten 30i dienkode menjadi 60p. Hasilnya akan terlihat lebih mirip dengan kaset video aslinyaSeiring waktu saya jadi cukup terbiasa dengan berbagai bagian ffmpeg. CLI-nya punya logika tersendiri, dan bergantung pada urutan. Tidak semua Unix CLI seperti itu
Belakangan ini saya mengutak-atik fitur yang lebih rumit. Misalnya menyimpan langsung rekaman mentah dari kamera video pada mesin yang cukup lambat. Saya membuat mikroskop, dan membaca frame dari kamera dalam format video mentah 120FPS (YUYV 1280x720), tetapi kalau disimpan begitu saja ke disk ukurannya membengkak sampai gigabita per menit. Disk memang murah, tapi tetap terasa boros, jadi saya meneliti teknik yang nyaris lossless untuk mengompres dan menyimpan citra akurat dengan cepat
Saya mendapati bahwa konversi RGB24 di ffmpeg sangat lambat, jadi setelah mengutak-atik command line cukup lama, saya akhirnya menetap pada ini:
ffmpeg -f rawvideo -pix_fmt yuyv422 -s 1280x720 -i test.raw -vcodec libx264 -pix_fmt yuv420p movie.mp4 -crf 13 -yVideo mentah tidak memiliki kontainer sehingga tidak punya metadata seperti “format piksel” atau “ukuran gambar”, jadi itu harus diberikan secara manual. Ini bergantung pada urutan, jadi semua yang ada sebelum
-i test.rawdipakai untuk dekode input, dan semua yang setelahnya dipakai untuk penulisan output. Hanya melakukan satu konversi format piksel yang sangat kecil saja (yang bisa diproses ffmpeg dengan sangat cepat), lalu menulis data dalam format nyaris lossless yang memiliki kontainer. Dalam kebanyakan kasus, kontainer.mkvadalah yang terbaikKarena tidak suka command line, akhirnya saya memakai ffmpeg-python dan membiarkannya menyusun command line dari kode berikut:
self.process = (ffmpeg.input("pipe:",format="rawvideo",pix_fmt="yuyv422",s="{}x{}".format(1280, 720),threads=8).output(fname, pix_fmt="yuv422p", vcodec="libx264", crf=13).overwrite_output().global_args("-threads", "8").run_async(pipe_stdin=True))Lalu pada praktiknya frame ditulis ke stdin proses tersebut dengan
write(). Mesin saya punya 12 core, dan karena setidaknya 2 core selalu dipakai untuk menggerakkan mikroskop, jumlah thread perlu dibatasiSaya masih mencari encoding YUV lossless yang lebih baik dan lebih cepat
Ketergantungan pada urutan itu masuk akal. Pipeline Unix juga bergantung pada urutan komponen, dan pemanggilan FFMpeg yang kompleks melakukan hal yang mirip dengan itu
Banyak orang menyukai estetika “fluent interface” seperti ffmpeg-python, tetapi dalam Python itu sering dianggap kurang Pythonic. Sepemahaman saya, ffmpeg-python memang dirancang untuk merefleksikan urutan command line dengan cukup dekat
Preferensi yang diperkuat oleh desain pustaka standar dan tipe bawaan adalah https://en.wikipedia.org/wiki/Command%E2%80%93query_separati... yang cukup kuat. Menurut prinsip ini, bentuknya kira-kira akan seperti berikut:
ffmpeg(global_args=..., overwrite_output=True).process_async(piped_input(...), output(...))Jika input dijadikan proses konfigurasi terpisah, akan muncul tipe runtime lain dan itu juga bisa memberi sinyal pada kode pemrosesan bahwa data harus dibaca dari stdin
Tidak perlu mencari lagi: FFV1 https://trac.ffmpeg.org/wiki/Encode/FFV1
Saya cuma ingin merekomendasikan satu kata: ramdisk
Jika ada file untuk tahap perantara yang perlu diproses tetapi tidak ingin disimpan, gunakan ramdisk. Benar-benar bagus
Saya kira ini akan menjadi situs web yang mengumpulkan dan mengelola pengetahuan yang dibangun para ahli FFmpeg, tetapi langsung kecewa dari contoh pertama yang saya klik
https://www.ffmpegbyexample.com/examples/l1bilxyl/get_the_du...
Jangan memanggil dua alat tambahan hanya untuk memproses string. Dengan FFprobe saja, Anda bisa langsung mendapatkan durasi atau nilai yang diinginkan:
ffprobe -loglevel quiet -output_format csv=p=0 -show_entries format=duration video.mp4Jangan berhenti hanya karena sesuatu sudah berjalan; setelah berhasil, pikirkan apakah masih ada cara untuk memperbaikinya
Meski begitu, saya lebih suka solusi yang Anda ajukan
Bagus. Ini mengingatkan saya pada cheatsheet ffmpeg yang saya pakai. Sepertinya semua orang yang sering memakai ffmpeg punya kumpulan catatan serupa
https://github.com/fastily/cheatsheet/blob/master/ffmpeg.md
https://github.com/ericfortis/quick-reference/blob/main/ffmp...
FFmpeg adalah salah satu alat yang terlalu jarang saya pakai sehingga sintaks pastinya tidak pernah benar-benar melekat di kepala. Pada akhirnya saya mendiktekan command line yang dibutuhkan ke LLM
Satu-satunya alat lain yang sama sulitnya bagi saya adalah MegaCLI bergaya 1990-an dari LSI Logic. Itu juga hampir tidak saya pakai tiap tahun, tetapi termasuk jenis alat yang harus digunakan dengan tepat di bawah tekanan
Saya sudah memakai FFMPEG lebih dari 15 tahun, tetapi masih hampir tidak bisa mengingat perintahnya. Meski begitu, saat memakai FFMPEG, LLM benar-benar luar biasa
Kalau Anda meminta ChatGPT dan Claude, “remux video ke mkv, sertakan subtitle.srt di dalam file, dan saya hanya ingin bagian dari 0:00:05 sampai 0:01:00,” mereka menanganinya dengan sangat baik. Kalau penasaran, hasilnya seperti ini:
ffmpeg -i input.mp4 -i subtitle.srt -ss 00:00:05 -to 00:01:00 -map 0 -map 1 -c copy -c:s mov_text output.mkvSaya penasaran, kalau tujuannya hanya menghasilkan perintah ffmpeg, seberapa kecil LLM yang bisa dibuat. Mungkin cukup kecil untuk ditaruh di halaman web statis dan dijalankan secara lokal?
Selama 15 tahun saya memelihara dokumen catatan pribadi berisi sintaks yang sering saya pakai. Kalau itu pun tidak cukup, saya
grepriwayat bashSaya juga sama. Yang melekat di kepala cuma cara mengubah format X ke
.mp4. Selebihnya harus saya cari lagi setiap kaliXKCD terkait https://xkcd.com/1168/
Beberapa hari lalu saya bercanda setengah serius bahwa kalau LLM bisa memberi tahu flag ffmpeg yang saya inginkan, mungkin membakar seluruh hutan hujan pun terasa sepadan
Jangan lupa juga bahwa ada GStreamer. Karena berbasis pipeline, baris perintah dan dokumentasinya sedikit lebih mudah dipahami daripada ffmpeg, dan penyusunannya juga terasa lebih masuk akal
Untuk pekerjaan video berat, saya sudah sepenuhnya berhenti memakai ffmpeg dan hanya menggunakan GStreamer
Namun untuk pekerjaan sekali pakai, ffmpeg terlihat jauh lebih ramah. Misalnya, ffmpeg punya default x264 yang masuk akal, tetapi dengan
gst-launch, untuk melakukan encoding x264 berkualitas baik Anda benar-benar harus tahu apa yang sedang Anda lakukanKita bisa menyusun graf yang kompleks dari source, sink, dan filter transformasi
Ada repositori GitHub berupa buku ffmpeg yang tampaknya bagus untuk melengkapi situs ini:
https://github.com/jdriselvato/FFmpeg-For-Beginners-Ebook
ffmpeg selalu terasa seperti aplikasi GUI yang dipaksa dijejalkan ke bentuk TUI
Saya juga pernah beberapa kali memakai API C-nya dengan pengalaman yang kurang menyenangkan; di banyak sisi memang intuitif, tetapi terlalu mudah untuk merepresentasikan state yang salah. Akan bagus kalau ada framework encoding AV1 real-time yang “langsung bekerja”
Ini pada dasarnya hampir satu-satunya alat yang membuat saya cenderung mencari HandBrake terlebih dahulu sebagai pengganti GUI. Satu-satunya pengecualian adalah saat melakukan pemrosesan batch
Ada juga beberapa GUI ffmpeg murni. Ada sesuatu dalam pekerjaan video yang membuat baris perintah tidak terlalu cocok dengan cara otak saya memprosesnya
Untuk API, saya bisa merekomendasikan GStreamer. Saya tidak terlalu akrab dengan API C-nya karena memakai binding Rust, tetapi kesannya bagus
Memang ada bagian yang jadi bertele-tele karena GObject, tetapi setelah dipahami, Anda bisa berinteraksi dengan semua objek di API secara konsisten. Kompleksitas yang dibutuhkan memang sangat banyak (video itu sulit), tetapi desain, implementasi, dan dokumentasinya cukup baik
Untuk kasus penggunaan umum, Bins(
decodebin,transcodebin,playbin) membuatnya cukup mudah. Bahkan untuk kasus yang lebih kompleks pun tetap dimungkinkan berkat fleksibilitas desainnyaSaya suka wawasannya, tetapi TUI itu sesuatu yang grafis, sedangkan ffmpeg hanyalah CLI
Akan keren kalau ada alat TUI. Sesuatu seperti https://github.com/Twinklebear/fbed tetapi dengan fitur yang lebih matang akan bagus
Di sistem Linux, saya suka membangun ffmpeg secara statis. Alasannya, versi distro sering terlalu lama atau tidak menyertakan modul yang saya sukai
Versi terkontainerisasi ini sangat berguna: https://github.com/wader/static-ffmpeg