FFmpeg เป็นโปรแกรมฟรีโอเพนซอร์ส สำหรับจัดการ Video, Audio และ Multimedia streams ออกแบบสำหรับควบคุมผ่าน Command line ในการประมวลผลไฟล์วิดีโอ/เสียง แต่เมื่อเรานี้มีรายงานข้อผิดพลาด Past Duration Too Large ขณะเข้ารหัส (encode) หรือลดขนาด (downscale) วิดีโอ

สาเหตุของข้อผิดพลาด "Past Duration Too Large" ใน FFmpeg
จากการสำรวจพบสาเหตุและวิธีแก้ไขที่แก้ปัญหาได้:
- ขาด Input Framerate: กรณีส่วนใหญ่ มาจากไม่ได้ระบุ Input framerate สำหรับภาพ ทำให้โปรแกรมสมมติว่า 25 fps ซึ่งอาจไม่ตรงกับความเป็นจริง
- ไม่ได้ใช้ Sync Settings: ผู้ใช้ส่วนใหญ่แก้ได้โดยเพิ่ม Sync settings บางครั้งเฟรมไม่ซิงค์ได้ ทำให้บางเฟรมถูก Drop และก่อให้เกิดข้อผิดพลาด
เข้าใจสาเหตุแล้ว มาดูวิธีแก้ไขตามลำดับ
วิธีแก้ไข 1: เพิ่ม Input Framerate
หากไม่ได้ระบุ Input framerate อาจทำให้เฟรมถูก Drop และเกิดข้อผิดพลาด ขั้นตอนนี้เพิ่ม Input frames
- สังเกตคำสั่งที่ใช้แปลงวิดีโอ อาจคล้ายกับ:
ffmpeg -i %05d.png -r 24 -c:v libx264 -crf 5 out.mkv
- เพียงแค่ เพิ่ม framerate เข้าไปในคำสั่ง:
ffmpeg -framerate 24 -i %05d.png -c:v libx264 -crf 5 out.mkv
- ตรวจสอบว่าปัญหาแก้ไขหรือยัง
วิธีแก้ไข 2: ใช้ Sync Flags
การเพิ่ม Sync flags ช่วยซิงค์ Output และ Input ตาม Framerate เริ่มต้นของวิดีโอ หากไม่ได้เพิ่ม Sync commands เฟรมอาจไม่ซิงค์ได้ ขั้นตอนนี้เพิ่มคำสั่ง Sync
- ในขั้นตอนนี้ คุณอาจใช้คำสั่ง:
ffmpeg -framerate 24 -i %05d.png -c:v libx264 -crf 5 out.mkv
- แทนที่จะใช้คำสั่งด้านบน ให้ใช้:
ffmpeg -framerate 24 -i %05d.png -c:v libx264 -crf 5 out.mkv -async 1 -vsync 1
- สังเกตว่าเพิ่มแค่ -async 1 -vsync 1 ท้ายคำสั่ง ต้องเพิ่มที่ท้ายคำสั่งที่คุณใช้
หมายเหตุ: คำสั่งต้นทางของคุณอาจต่างจากตัวอย่าง แต่วิธีเพิ่ม -async 1 -vsync 1 จะเหมือนกัน