'ระยะเวลาในอดีต X.XXX ใหญ่เกินไป' หมายถึงอะไร


142

เมื่อทำการเข้ารหัส H.264 โดยใช้ ffmpeg ฉันจะได้รับคำเตือนประเภทต่อไปนี้:

Past duration 0.603386 too large
Past duration 0.614372 too large
Past duration 0.606377 too large

พวกเขาหมายถึงอะไร? ฉันไม่พบสิ่งใดที่ชัดเจนทางออนไลน์หรือในเอกสาร ffmpeg


2
โปรดส่งคำถาม ffmpeg ไปที่video.stackexchange.comเบต้า ดูคำอธิบายแท็ก ffmpeg
Ondra Žižka

34
@Ondra แม้แต่การแลกเปลี่ยนอื่น ๆ ฉันสับสนกับไซต์ย่อยกว่า 100 รายการฉันไม่แน่ใจว่าเป็นทิศทางที่ดีที่ stackexchange กำลังมุ่งหน้าไป
mxmlnkn

1
@mxmlnkn ฉันยอมรับมันทำให้คุณยาวสำหรับครั้งง่าย ... :)
เอริค

4
ฉันคิดว่ามันคือ. StackOverflow ใช้สำหรับการเขียนโปรแกรมนี่ไม่ใช่การเขียนโปรแกรม มีเว็บไซต์ถามตอบสำหรับการประมวลผลวิดีโอคำถามนี้เกี่ยวกับการประมวลผลวิดีโอ ไม่เข้าใจอะไร
Ondra Žižka

อ่านคำอธิบายแท็กด้วย
Ondra Žižka

คำตอบ:


23

ฉันได้รับการเตือนนับพันครั้งด้วยการเข้ารหัสเฉพาะ ฉันลดขนาดวิดีโอ 1080p เป็น 480p ณ จุดแก้ไขที่ซึ่งมีวิดีโอหลบซึ่งเกิดจากข้อบกพร่องในแหล่งเลเซอร์ดิสก์ข้อความเหล่านี้เริ่มขึ้นมาจากนั้นก็ปรากฏขึ้นมาฉันคิดว่าทุกเฟรมหลังจากนั้น พวกเขาไปเรื่อย ๆ เหมือนข้อความที่ตัดตอนมาสั้น ๆ :

Past duration 0.901115 too large=  535031kB time=00:54:15.06 bitrate=1346.5kbits/s dup=0 drop=19 speed=1.15x    
    Last message repeated 31 times
Past duration 0.901115 too large=  535031kB time=00:54:15.62 bitrate=1346.3kbits/s dup=0 drop=19 speed=1.15x    
    Last message repeated 34 times
Past duration 0.901115 too large=  535031kB time=00:54:16.21 bitrate=1346.0kbits/s dup=0 drop=19 speed=1.15x    
    Last message repeated 36 times
Past duration 0.901115 too large=  535338kB time=00:54:16.83 bitrate=1346.5kbits/s dup=0 drop=19 speed=1.15x    
    Last message repeated 39 times

การร้องขอ ffmpeg ดั้งเดิมคือสิ่งนี้:

ffmpeg -i input.mp4 -s 720x480 -c:v libx264 -preset slower -crf 17 -c:a copy -y output.mkv

ทำตามคำแนะนำที่นี่ฉันเพิ่ม -framerate 60000/1001 ครั้งแรกในอินพุต นั่นไม่ได้ปรับปรุงอะไรเลย ฉันยังคง - คงไว้และเพิ่ม -r 60000/1001 ไปยังเอาต์พุต ที่ยังไม่ได้ปรับปรุงอะไร ในที่สุดการรักษาทั้งสองฉันก็เพิ่ม -async 1 -vsync 1 สิ่งนี้ทำให้ฉันได้รับคำเตือนเพียงครั้งเดียวและนั่นคือทั้งหมด การภาวนานั้นคือ:

ffmpeg -i input.mp4 -framerate 60000/1001 -s 720x480 -c:v libx264 -preset slower -crf 17 -c:a copy -y output.mkv -r 60000/1001 -async 1 -vsync 1

ความแตกต่างเดียวที่ฉันพบในดัมพ์รายละเอียดจาก MediaInfo คือการลบบรรทัดนี้ที่พบในการเรียกใช้ดั้งเดิม แต่ไม่ได้อยู่ในอันที่สอง:

Delay relative to video                  : -33ms

อย่างไรก็ตามฉันตรวจสอบการซิงค์ A / V ใกล้กับจุดเริ่มต้นของไฟล์และใกล้ถึงจุดสิ้นสุดและไม่มีความแตกต่างที่สังเกตเห็นได้ในการซิงค์ระหว่างสองไฟล์ เวลาในการทำงานของพวกเขายังเท่าเดิม แต่วัดได้เพียงวินาทีที่ใกล้ที่สุดใน VLC ดังนั้นฉันตรวจสอบจำนวนเฟรมโดยใช้ ffmpeg ดังนี้:

ffmpeg -i output.mkv -map 0:v:0 -c copy -f null -

และค้นหา "frame = #" ใกล้ถึงจุดสิ้นสุดของเอาต์พุต

ปรากฎว่าวิดีโอต้นฉบับมีความยาว 375226 เฟรมการเรียกใช้ดั้งเดิมให้ผล 375195 เฟรมและการเรียกใช้ครั้งที่สองให้ผลตอบแทน 375200 ดังนั้นการเรียกใช้ครั้งที่สองด้วยข้อความเตือนที่น้อยกว่าจึงลดลง 5 เฟรมน้อยลง

การทดสอบครั้งต่อมาแสดงให้เห็นว่า -framerate และ -r นั้นไม่จำเป็นและการใช้แฟล็กการซิงค์สองรายการก็เพียงพอแล้ว สิ่งนี้ให้ผลลัพธ์ที่เหมือนกันกับการเรียกใช้ครั้งที่สองด้านบนดังนั้นการร้องขอที่สามและง่ายที่สุดที่ฉันพบเพื่อแก้ปัญหาคือ:

ffmpeg -i input.mp4 -s 720x480 -c:v libx264 -preset slower -crf 17 -c:a copy -y output.mkv -async 1 -vsync 1

และอีกไฟล์หนึ่งก็สร้างคำเตือนเหล่านี้จำนวนมากแม้จะมีแฟล็กการซิงค์ แต่การเพิ่มแฟล็กอัตรากลับมาเป็น "คงที่" (ผลิตได้เพียงสองรายการแทนที่จะเป็นคำเตือนนับพัน) ดังนั้นบางครั้งการเรียกที่สองก็ใช้งานได้เมื่อครั้งที่สามไม่ทำงาน เพื่อวัตถุประสงค์ในทันทีของฉันฉันจะจัดการกับการขอร้องครั้งที่สองและหวังว่ามันจะแก้ไขปัญหาส่วนใหญ่ได้

นี่คือทั้งหมดที่มี ffmpeg รุ่น 4.0


2
ขอบคุณสำหรับสิ่งนี้! หลังจากผ่านไปหลายวันแล้วให้-async 1 -vsync 1แก้ไขให้ฉัน
Offek

1
ขอบคุณสำหรับการวิเคราะห์ @larryy นี้มีประโยชน์มาก
deepelement

90

หนึ่งในผู้ดูแลสำหรับโครงการ DVDStyler บน SourceForge กล่าวนี้เกี่ยวกับมัน

เวอร์ชัน FFMpeg หลังจากวันที่ 15 มกราคม 2015 มักจะแสดงคำเตือนนี้ มีการเพิ่มเพื่อเตือนเกี่ยวกับการบิดเบือนการควบคุมอัตราที่เป็นไปได้มิฉะนั้นจะไม่ก่อให้เกิดอันตรายใด ๆ


'การควบคุมอัตราความผิดเพี้ยน' เกี่ยวข้องกับการเข้ารหัส (ส่วนใหญ่เป็นวิดีโอ) และไม่มีความเกี่ยวข้องกับคำเตือนนี้ซึ่งเกี่ยวกับว่าการประทับเวลาเอาท์พุทแตกต่างกันมากเกินไป (ค่อนข้าง) เมื่อเทียบกับการประทับเวลาอินพุต
Gyan

สองสามครั้งแรกที่ฉันได้รับคำเตือนฉันยกเลิกการแปลง แต่คำแนะนำนี้ทำให้ฉันปล่อยให้มันทำงานและคำเตือนหยุดลงหลังจากผ่านไปครู่หนึ่งและการแปลงเสร็จสมบูรณ์ ขอบคุณ
IRTFM

58

ข้อความเตือนนี้จะปรากฏขึ้นเมื่อพยายามเข้ารหัสแหล่งเฟรมที่มีอัตราเฟรมสูงไปยังเอาต์พุตของเฟรมเรตต่ำซึ่งหมายถึงต้องทิ้งเฟรม


ฉันมีข้อผิดพลาดนี้เพราะฉันต้องการแปลงชุดรูปภาพเป็นวิดีโอ:

ffmpeg -i %05d.png -r 24 -c:v libx264 -crf 5 out.mkv

ปัญหาดูเหมือนว่าถ้าไม่มีอัตราเฟรมให้สำหรับการป้อนข้อมูลแล้วอัตราเฟรม 25 เฟรมต่อวินาทีจะถือว่า:

Input #0, image2, from 'frames/%04d.bmp':
  Duration: 00:00:15.96, start: 0.000000, bitrate: N/A
    Stream #0:0: Video: bmp, bgra, 920x650, 25 fps, 25 tbr, 25 tbn, 25 tbc

สิ่งนี้สามารถเห็นได้จากจำนวนเฟรมทั้งหมดที่เข้ารหัส ฉันมี 400 ภาพ แต่คำสั่งด้านบนเข้ารหัสเพียง 384:

frame=  384 fps= 68 q=-1.0 Lsize=   10931kB time=00:00:15.91 bitrate=5626.1kbits/s dup=0 drop=15    
video:10928kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.033807%

ข้อความแสดงข้อผิดพลาดจะหายไปโดยการตั้งค่าอัตราเฟรมอินพุตแทนหากอัตราเฟรมเอาต์พุต อัตราเฟรมเอาต์พุตจะถูกเลือกโดยอัตโนมัติว่าเป็นอินพุต นอกจากนี้ในรุ่นใหม่ ffmpeg คุณต้องระวังเพราะเมื่อใช้ภาพ PNG กับ-iตัวเลือกหรือค่อนข้างimage2หรือv4l2รูปแบบการป้อนข้อมูลที่คุณต้องใช้-framerateแทนการ-rดูที่เอกสารสำหรับ-rตัวเลือก

ffmpeg -framerate 24 -i %05d.png -c:v libx264 -crf 5 out.mkv

นอกจากนี้ยังเป็นไปได้ที่จะระบุอัตราเฟรมของทั้งอินพุตและเอาต์พุตแยกต่างหาก:

ffmpeg -framerate 25 -i %05d.png -r 10 -c:v libx264 -crf 5 out.mkv

ในกรณีนี้จะมีการเข้ารหัสเฟรม 161/400 เฟรมเท่านั้น เฟรมอื่น ๆ ระหว่างกาลจะลดลง ข้อความแสดงข้อผิดพลาดก็หายไปด้วยฉันเดาว่าเพื่อที่จะไม่ทำให้ ffmpeg ทำงานช้าลงโดยการส่งสแปมไปยัง stdout โปรดดู:


3
"เพราะเฉพาะเมื่อใช้อิมเมจ PNG พร้อมตัวเลือก -i คุณต้องใช้ -framerate แทน -r" - นี่ช่วยแก้ไขปัญหาของฉันได้อย่างสมบูรณ์ขอบคุณ!
ไม่ระบุชื่อ

1
ในการพยายามแปลง wmv เป็น mp4 การใช้-rงานที่-framerateไม่ได้ใช้
1934286

+1 และฉันแนะนำให้ย้าย "สรุป" ของคุณที่ด้านบน มากขึ้นเนื่องจากมันช่วยแก้ไขกรณีของฉันในการแปลงภาพเป็นวิดีโอและพยายามเพิ่มเอาท์พุทรวมเฟรมและเพิ่มความเร็วเอาต์พุตเช่นกัน ฉันเริ่มจากสิ่ง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"นี้โดยไม่มีการเตือนอีกต่อไปffmpeg -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"(โปรดสังเกตสิ่งที่-framerate 50เพิ่มเข้ามา)
el-teedee

49

การดูซอร์สโค้ดดูเหมือนว่าความแตกต่างระหว่างเวลาการนำเสนอ (pts) ในอินพุตสตรีมแตกต่างจากหนึ่งในสตรีมเอาต์พุตมากกว่ามากกว่าขีด จำกัด คงที่ที่ตั้งไว้ที่ 0.6

ตัวอย่างจากแหล่งที่มา:

    delta0 = sync_ipts - ost->sync_opts;
    delta  = delta0 + duration;

...

        if (delta0 < 0 &&
        delta > 0 &&
        format_video_sync != VSYNC_PASSTHROUGH &&
        format_video_sync != VSYNC_DROP) {
        double cor = FFMIN(-delta0, duration);
        if (delta0 < -0.6) {
            av_log(NULL, AV_LOG_WARNING, "Past duration %f too large\n", -delta0);
        } else
            av_log(NULL, AV_LOG_DEBUG, "Cliping frame in rate conversion by %f\n", -delta0);
        sync_ipts += cor;
        duration -= cor;
        delta0 += cor;
    }

นี่เป็นเพียงภาพรวมอย่างรวดเร็วดังนั้นโปรดอย่าลังเลที่จะขุดลึกลงไป


มีสิ่งใดบ้างที่เราสามารถทำได้เพื่อ "แก้ไข" ปัญหานี้หรือตั้งจุดส่งออกอย่างชัดเจน?
Baodad

1
ฉันจำรายละเอียดเกี่ยวกับปัญหานี้ไม่ได้ แต่หาก "แก้ไข" คุณหมายถึงการกำจัดคำเตือนจากนั้นตามรหัสข้างต้นคุณสามารถดูตัวเลือกformat_video_sync = VSYNC_DROPหรือformat_video_sync = VSYNC_PASSTHROUGHดูว่าหนึ่งในนั้นทำงานได้หรือไม่
Erik

ขอบคุณ ฉันพบการตั้งค่าอัตราเฟรมอย่างชัดเจนโดยใช้-rสวิตช์ "แก้ไข" คำเตือนเหล่านี้
Baodad

1
บางสิ่งจากประสบการณ์ส่วนตัว: ฉันมีปัญหา "ช่วงเวลาที่ผ่านมา" ของข้อความสแปมและแก้ไขโดยการบังคับใช้อัตราเฟรมอินพุตด้วย -r 25 แต่จากนั้นฉันก็เริ่มได้รับการซิงค์เสียงอย่างหนัก การลบตัวเลือก -r และใช้ "-async 1 -vsync 1" เพื่อป้องกันเสียง desync ได้ป้องกันปัญหาด้านเสียง แต่ดูเหมือนว่าสแปม "ช่วงเวลาที่ผ่านมา" ก็จะหายไปเช่นกัน
Jason Lang

ใน v 4.1 และใหม่กว่าระดับการบันทึกได้รับการอัพเกรดดังนั้นจะไม่ปรากฏในระดับการบันทึกเริ่มต้น
Gyan


1

คำสั่งควรเป็นจริง:

ffmpeg -loglevel quiet -i input_file.xyz ...

ไม่มีคำนำหน้า "-" ในพารามิเตอร์ "เงียบ" เนื่องจากไม่ใช่ตัวเลือก แต่เป็นค่าสำหรับตัวเลือก "-loglevel"

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.