Saya memiliki video dari kamera keamanan yang awalnya direkam pada frame rate rendah, mungkin 15 fps, mungkin 10 fps, bahkan mungkin lebih sedikit. Sejak itu telah dikonversi oleh orang lain menjadi 25 fps (tanpa mengubah durasinya). Saya berasumsi bahwa tambahan, duplikat frame telah ditambahkan, dan mungkin ini juga sedikit terdistorsi waktu yang tepat di mana bingkai asli ditampilkan.
Saya ingin menyandikan ulang video dengan ffmpeg ke frame rate aslinya, tanpa menjatuhkan frame yang berguna dari gerakan aktual. Jika saya hanya menggunakan fps
filter itu tidak akan selektif tentang frame mana yang disimpan, dan saya berasumsi bahwa karena kesalahan pembulatan itu bisa berakhir dengan mempertahankan beberapa duplikat frame dan secara permanen kehilangan frame yang berguna, membuat segalanya menjadi lebih buruk. Dalam kasus apa pun, saya tidak tahu nomor apa yang harus diceritakan filter karena saya tidak tahu persis berapa frame rate aslinya!
Bagaimana saya bisa melanjutkan untuk memperbaiki video ini dengan ffmpeg?
ffmpeg -i "orig.mp4" -an -vcodec h264 -vf "fps=???" "fixed.mp4"
Jawaban:
Saya berhasil memperbaiki file saya. Saya menemukan
mpdecimate
filter, yang menjatuhkan bingkai duplikat atau dekat duplikat dari aliran video. Pertama saya mencoba:Saya menambahkan
-loglevel debug
untuk mendapatkan lebih banyak info selama transcoding. Info menunjukkan apampdecimate
yang dilakukan dengan bingkai, yang banyak dan banyak dari pola ini:Yaitu, itu secara konsisten menjatuhkan 4 frame berturut-turut sebagai duplikat dan menjaga setiap 5. Ini menunjukkan bahwa frame rate asli adalah 1/5 dari apa yang sekarang. Saya beruntung! Karena video 25 fps saat ini adalah kelipatan dari frame rate asli, seharusnya tidak ada masalah dengan misalignment temporal dari frame yang disimpan dan dijatuhkan. Karena itu saya mentranskode ulang video asli dengan tidak lebih rumit dari itu
-vf "fps=5"
, dan hasilnya tampak baik-baik saja. Hanya untuk memastikan, saya menyalurkan output melaluimpdecimate
filter, dan mendeteksi semua frame yang tersisa sebagai "keep". Jadi file aslinya tidak begitu kacau seperti yang saya kira.sumber
Jika frame tambahan adalah duplikat dan bukan interpolasi, maka yang berikut ini mungkin berfungsi:
Idenya adalah untuk memilih semua frame bukan duplikat dari frame sebelumnya. Kemudian PTSes diregenerasi sesuai dengan tingkat output yang ditentukan. Anda mungkin harus mengubah nilai adegan ke atas atau ke bawah untuk mendapatkan filter deteksi yang benar. Jika video muncul lebih cepat atau lebih lambat daripada waktu nyata maka turunkan atau naikkan nilai masing-masing (dan setpts nilai penyebut).
sumber