Kurangi kecepatan bingkai video tanpa menjatuhkan bingkai yang bermanfaat

5

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 fpsfilter 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"
Boann
sumber
Tampaknya tidak mungkin itu bisa dilakukan, terutama jika Anda tidak tahu persis "algoritma" yang digunakan konverter. Kedengarannya seperti masalah pull-down btw.
Tom Yan

Jawaban:

6

Saya berhasil memperbaiki file saya. Saya menemukan mpdecimatefilter, yang menjatuhkan bingkai duplikat atau dekat duplikat dari aliran video. Pertama saya mencoba:

ffmpeg -loglevel debug -i orig.mp4 -an -vf "mpdecimate" test.mp4

Saya menambahkan -loglevel debuguntuk mendapatkan lebih banyak info selama transcoding. Info menunjukkan apa mpdecimateyang dilakukan dengan bingkai, yang banyak dan banyak dari pola ini:

lo:0<217 lo:0<-2147483648 lo:0<-2147483648 drop pts:44032 pts_time:3.44 drop_count:1
lo:0<217 lo:0<-2147483648 lo:0<-2147483648 drop pts:44544 pts_time:3.48 drop_count:2
lo:0<217 lo:0<-2147483648 lo:0<-2147483648 drop pts:45056 pts_time:3.52 drop_count:3
lo:0<217 lo:0<-2147483648 lo:0<-2147483648 drop pts:45568 pts_time:3.56 drop_count:4
781>=hi keep pts:46080 pts_time:3.6 drop_count:-1
lo:0<217 lo:0<-2147483648 lo:0<-2147483648 drop pts:46592 pts_time:3.64 drop_count:1
lo:0<217 lo:0<-2147483648 lo:0<-2147483648 drop pts:47104 pts_time:3.68 drop_count:2
lo:0<217 lo:0<-2147483648 lo:0<-2147483648 drop pts:47616 pts_time:3.72 drop_count:3
lo:0<217 lo:0<-2147483648 lo:0<-2147483648 drop pts:48128 pts_time:3.76 drop_count:4
821>=hi keep pts:48640 pts_time:3.8 drop_count:-1
lo:0<217 lo:0<-2147483648 lo:0<-2147483648 drop pts:49152 pts_time:3.84 drop_count:1
lo:0<217 lo:0<-2147483648 lo:0<-2147483648 drop pts:49664 pts_time:3.88 drop_count:2
lo:0<217 lo:0<-2147483648 lo:0<-2147483648 drop pts:50176 pts_time:3.92 drop_count:3
lo:0<217 lo:0<-2147483648 lo:0<-2147483648 drop pts:50688 pts_time:3.96 drop_count:4
793>=hi keep pts:51200 pts_time:4 drop_count:-1

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 melalui mpdecimatefilter, dan mendeteksi semua frame yang tersisa sebagai "keep". Jadi file aslinya tidak begitu kacau seperti yang saya kira.

Boann
sumber
2

Jika frame tambahan adalah duplikat dan bukan interpolasi, maka yang berikut ini mungkin berfungsi:

ffmpeg -i orig.mp4 -an -vf "select='gt(scene\,0.001)',setpts=N/(10*TB)" -r 10 fixed.mp4

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).

Gyan
sumber
Saya pikir ini bisa berhasil, tetapi saya merasa sulit untuk menyetelnya dengan benar. Saya menemukan filter "mpdecimate" pada akhirnya dan menggunakannya karena sepertinya memberikan hasil "dupe atau tidak dupe" yang lebih pasti untuk setiap frame.
Boann