เมื่อทำการเข้ารหัส H.264 โดยใช้ ffmpeg ฉันจะได้รับคำเตือนประเภทต่อไปนี้:
Past duration 0.603386 too large
Past duration 0.614372 too large
Past duration 0.606377 too large
พวกเขาหมายถึงอะไร? ฉันไม่พบสิ่งใดที่ชัดเจนทางออนไลน์หรือในเอกสาร ffmpeg
เมื่อทำการเข้ารหัส H.264 โดยใช้ ffmpeg ฉันจะได้รับคำเตือนประเภทต่อไปนี้:
Past duration 0.603386 too large
Past duration 0.614372 too large
Past duration 0.606377 too large
พวกเขาหมายถึงอะไร? ฉันไม่พบสิ่งใดที่ชัดเจนทางออนไลน์หรือในเอกสาร ffmpeg
คำตอบ:
ฉันได้รับการเตือนนับพันครั้งด้วยการเข้ารหัสเฉพาะ ฉันลดขนาดวิดีโอ 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
-async 1 -vsync 1
แก้ไขให้ฉัน
หนึ่งในผู้ดูแลสำหรับโครงการ DVDStyler บน SourceForge กล่าวนี้เกี่ยวกับมัน
เวอร์ชัน FFMpeg หลังจากวันที่ 15 มกราคม 2015 มักจะแสดงคำเตือนนี้ มีการเพิ่มเพื่อเตือนเกี่ยวกับการบิดเบือนการควบคุมอัตราที่เป็นไปได้มิฉะนั้นจะไม่ก่อให้เกิดอันตรายใด ๆ
ข้อความเตือนนี้จะปรากฏขึ้นเมื่อพยายามเข้ารหัสแหล่งเฟรมที่มีอัตราเฟรมสูงไปยังเอาต์พุตของเฟรมเรตต่ำซึ่งหมายถึงต้องทิ้งเฟรม
ฉันมีข้อผิดพลาดนี้เพราะฉันต้องการแปลงชุดรูปภาพเป็นวิดีโอ:
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 โปรดดู:
-r
งานที่-framerate
ไม่ได้ใช้
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
เพิ่มเข้ามา)
การดูซอร์สโค้ดดูเหมือนว่าความแตกต่างระหว่างเวลาการนำเสนอ (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;
}
นี่เป็นเพียงภาพรวมอย่างรวดเร็วดังนั้นโปรดอย่าลังเลที่จะขุดลึกลงไป
format_video_sync = VSYNC_DROP
หรือformat_video_sync = VSYNC_PASSTHROUGH
ดูว่าหนึ่งในนั้นทำงานได้หรือไม่
-r
สวิตช์ "แก้ไข" คำเตือนเหล่านี้
ตามปัญหา FFmpeg # 4700 - ช่วงเวลาที่ผ่านมา 0.999992 มีขนาดใหญ่เกินไป มันเป็นเพียงการเตือน ใช้:
ffmpeg -loglevel -quiet -i input_file.xyz ....
เพื่อหยุดมัน
เน็ด
คำสั่งควรเป็นจริง:
ffmpeg -loglevel quiet -i input_file.xyz ...
ไม่มีคำนำหน้า "-" ในพารามิเตอร์ "เงียบ" เนื่องจากไม่ใช่ตัวเลือก แต่เป็นค่าสำหรับตัวเลือก "-loglevel"