Saat menyandikan H.264 menggunakan ffmpeg saya mendapatkan jenis peringatan berikut ini secara massal:
Past duration 0.603386 too large
Past duration 0.614372 too large
Past duration 0.606377 too large
Apa yang mereka maksud? Saya belum menemukan sesuatu yang jelas online atau dalam dokumentasi ffmpeg.
Jawaban:
Saya mendapatkan ribuan peringatan ini dengan penyandian khusus. Saya menurunkan video 1080p menjadi 480p. Pada titik edit, di mana ada beberapa video yang cerdik karena cacat pada laserdisc sumber, pesan-pesan ini mulai muncul dan kemudian muncul untuk, saya pikir, setiap frame sesudahnya. Mereka terus dan terus, seperti kutipan singkat ini:
Doa ffmpeg asli adalah ini:
Mengikuti saran di sini saya pertama kali menambahkan -framerate 60000/1001 ke input. Itu tidak memperbaiki apa pun. Saya mempertahankan -framerate dan menambahkan -r 60000/1001 ke output. Itu masih tidak meningkatkan apa pun. Mempertahankan keduanya akhirnya saya tambahkan -async 1 -vsync 1. Hal ini mengakibatkan saya menerima satu peringatan, dan hanya itu. Doa itu adalah:
Satu-satunya perbedaan yang saya temukan dalam dump terperinci dari MediaInfo adalah penghapusan baris ini yang ditemukan dalam doa asli tetapi tidak pada yang kedua:
Namun, saya memeriksa sinkronisasi A / V di dekat bagian awal file dan di dekat bagian akhir, dan tidak ada perbedaan yang terlihat dalam sinkronisasi antara kedua file. Waktu berlari mereka juga sama, tetapi itu hanya diukur ke detik terdekat, di VLC. Jadi saya memeriksa jumlah frame menggunakan ffmpeg seperti:
dan mencari "frame = #" di dekat akhir output.
Ternyata sumber video panjangnya 375226 frame, doa asli menghasilkan 375195 frame, dan doa kedua menghasilkan 375200. Jadi doa kedua, dengan pesan peringatan yang jauh lebih sedikit juga turun 5 frame lebih sedikit.
Pengujian selanjutnya menunjukkan bahwa -framerate dan -r tidak perlu, dan hanya menggunakan dua flag sinkronisasi sudah cukup. Ini menghasilkan hasil yang identik dengan doa kedua di atas, jadi doa ketiga dan paling sederhana yang saya temukan untuk menyelesaikan masalah adalah ini:
Dan file lain kemudian menghasilkan banyak peringatan ini bahkan dengan flag sinkronisasi, tetapi menambahkan kembali flag rate "memperbaiki" itu (hanya menghasilkan dua bukannya ribuan peringatan). Jadi kadang-kadang doa kedua bekerja ketika yang ketiga tidak. Untuk tujuan langsung saya, saya akan menyelesaikan doa kedua dan berharap itu memperbaiki sebagian besar masalah ini.
Ini semua dengan ffmpeg versi 4.0.
sumber
-async 1 -vsync 1
perbaiki untuk saya.Salah satu pengelola untuk proyek DVDStyler di SourceForge mengatakan ini tentang hal itu:
sumber
Pesan peringatan ini muncul ketika mencoba untuk menyandikan sumber frame rate tinggi ke output frame rate rendah, yang berarti frame harus dijatuhkan.
Saya mengalami kesalahan ini karena saya ingin mengonversi serangkaian gambar ke video:
Masalahnya tampaknya, bahwa jika tidak ada frame rate yang diberikan untuk input, maka frame rate 25 fps diasumsikan:
Ini juga dapat dilihat pada jumlah total frame yang dikodekan. Saya memiliki 400 gambar, tetapi perintah di atas hanya menyandikan 384:
Pesan kesalahan menghilang dengan mengatur laju bingkai input sebagai gantinya jika frame rate output. Frame rate output kemudian akan secara otomatis dipilih sebagai input. Selain itu dalam versi ffmpeg baru Anda harus hati-hati, karena bila menggunakan gambar PNG dengan
-i
pilihan atau lebih tepatnyaimage2
atauv4l2
format masukan, Anda harus menggunakan-framerate
bukan-r
, lihat dokumentasi untuk-r
pilihan .Dimungkinkan juga untuk menentukan frame rate dari input dan output secara terpisah:
Dalam hal ini hanya 161/400 frame yang akan dikodekan. Sementara bingkai lainnya akan dijatuhkan. Juga pesan kesalahan hilang, saya kira untuk tidak memperlambat ffmpeg dengan mengirim spam ke stdout, lihat:
sumber
-r
bekerja di mana menggunakan-framerate
tidak.ffmpeg -pattern_type glob -i '*.jpg' -filter:v "setpts=0.25*PTS" -r 50 "$( date "+%Y-%m-%d_%H%M%S")-timelapse-x4-50fps.mp4"
ke ini tanpa peringatan lagiffmpeg -framerate 50 -pattern_type glob -i '*.jpg' -filter:v "setpts=0.25*PTS" -r 50 "$( date "+%Y-%m-%d_%H%M%S")-timelapse-x4-50fps.mp4"
(perhatikan-framerate 50
masukan yang ditambahkan)Melihat kode sumber tampaknya perbedaan antara waktu presentasi (pts) dalam aliran input berbeda dari yang ada di aliran output dengan lebih dari batas tetap yang ditetapkan ke 0,6.
Cuplikan dari sumber:
...
Ini hanya sekilas, jadi silakan menggali lebih dalam.
sumber
format_video_sync = VSYNC_DROP
atauformat_video_sync = VSYNC_PASSTHROUGH
dan melihat apakah salah satu dari mereka layak dalam kasus penggunaan Anda.-r
saklar "memperbaiki" peringatan ini.Sesuai isu FFmpeg # 4700 - Durasi masa lalu 0,999992 terlalu besar itu hanya peringatan. Menggunakan:
Untuk menghentikannya.
Ned
sumber
Perintah sebenarnya harus:
Tidak ada awalan "-" ke parameter "quiet", karena ini bukan opsi, melainkan nilai untuk opsi "-loglevel".
sumber