'Thời lượng quá khứ X.XXX quá lớn' nghĩa là gì?


142

Khi mã hóa H.264 bằng ffmpeg, tôi nhận được các loại cảnh báo sau đây:

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

Có ý nghĩa gì? Tôi không tìm thấy bất cứ điều gì rõ ràng trực tuyến hoặc trong tài liệu ffmpeg.


2
Vui lòng gửi câu hỏi ffmpeg đến video.stackexchange.com beta. Xem mô tả thẻ ffmpeg.
Ondra ižka

34
@Ondra Thậm chí một stackexchange khác? Tôi đang bị lẫn lộn với hơn 100 trang con đó, tôi không chắc đó có phải là hướng tích cực mà stackexchange đang hướng tới hay không.
mxmlnkn

1
@mxmlnkn Tôi đồng ý, nó khiến bạn khao khát thời gian đơn giản hơn ... :)
Erik

4
Tôi nghĩ rằng nó là. StackOverflow là dành cho lập trình, đây không phải là lập trình. Có một trang web hỏi đáp để xử lý video, đây là một câu hỏi về xử lý video. Có gì không hiểu?
Ondra ižka

Cũng đọc mô tả thẻ.
Ondra ižka

Câu trả lời:


23

Tôi đã nhận được hàng ngàn cảnh báo này với một mã hóa cụ thể. Tôi đã hạ thấp video 1080p xuống 480p. Tại một điểm chỉnh sửa, nơi có một số video tinh ranh do lỗi của đĩa laser nguồn, các thông báo này bắt đầu xuất hiện và sau đó xuất hiện, tôi nghĩ, mọi khung hình sau đó. Họ tiếp tục và tiếp tục, như đoạn trích ngắn này:

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

Yêu cầu ban đầu của ffmpeg là:

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

Sau những gợi ý ở đây, lần đầu tiên tôi đã thêm - 60000/1001 vào đầu vào. Điều đó đã không cải thiện bất cứ điều gì. Tôi giữ lại -framerator và thêm -r 60000/1001 vào đầu ra. Điều đó vẫn không cải thiện bất cứ điều gì. Giữ lại cả hai cuối cùng tôi đã thêm -async 1 -vsync 1. Điều này dẫn đến việc tôi nhận được một cảnh báo duy nhất, và đó là tất cả. Lời cầu khẩn đó là:

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

Sự khác biệt duy nhất tôi tìm thấy trong một kết xuất chi tiết từ MediaInfo là loại bỏ dòng này được tìm thấy trong lời gọi ban đầu nhưng không phải trong lần thứ hai:

Delay relative to video                  : -33ms

Tuy nhiên, tôi đã kiểm tra đồng bộ A / V ở gần đầu tệp và gần cuối và không có sự khác biệt rõ rệt nào về đồng bộ giữa hai tệp. Thời gian chạy của chúng cũng giống nhau, nhưng chỉ được đo đến giây gần nhất, tính bằng VLC. Vì vậy, tôi đã kiểm tra số lượng khung hình bằng cách sử dụng ffmpeg như vậy:

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

và tìm kiếm "frame = #" gần cuối đầu ra.

Hóa ra video nguồn dài 375226 khung hình, lần gọi ban đầu mang lại 375195 khung hình và lần gọi thứ hai mang lại 375200. Vì vậy, lần gọi thứ hai, với số lượng thông báo cảnh báo ít hơn cũng giảm 5 khung hình.

Thử nghiệm sau đó cho thấy -framerator và -r là không cần thiết và chỉ cần sử dụng hai cờ đồng bộ là đủ. Điều này tạo ra kết quả giống hệt với lần gọi thứ hai ở trên, vì vậy lần gọi thứ ba và đơn giản nhất mà tôi tìm thấy để giải quyết vấn đề là:

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

Và một tệp khác sau đó đã tạo ra một loạt các cảnh báo này ngay cả với các cờ đồng bộ hóa, nhưng thêm lại các cờ tỷ lệ "đã sửa" nó (chỉ tạo ra hai thay vì hàng ngàn cảnh báo). Vì vậy, đôi khi lời gọi thứ hai hoạt động khi lần thứ ba không. Đối với mục đích trước mắt của tôi, tôi sẽ giải quyết lần gọi thứ hai và hy vọng nó sẽ khắc phục được hầu hết các vấn đề này.

Đây là tất cả với phiên bản ffmpeg 4.0.


2
Cảm ơn vì điều này! Sau những ngày có vấn đề, -async 1 -vsync 1sửa nó cho tôi.
Offek

1
Cảm ơn vì phân tích này @larryy rất hữu ích
chia sẻ

90

Một trong những người bảo trì cho dự án DVDStyler trên SourceForge đã nói điều này về nó:

Các phiên bản FFMpeg sau ngày 15 tháng 1 năm 2015 thường hiển thị cảnh báo này. Nó đã được thêm vào để cảnh báo về sự biến dạng kiểm soát tỷ lệ có thể, nếu không nó không gây ra bất kỳ tác hại nào.


'Biến dạng kiểm soát tốc độ' có liên quan đến mã hóa (chủ yếu là video) và không liên quan đến cảnh báo này, đó là về việc liệu dấu thời gian đầu ra có khác biệt quá nhiều (tương đối) so với dấu thời gian đầu vào
Gyan

Một vài lần đầu tiên tôi nhận được cảnh báo tôi đã chấm dứt chuyển đổi, nhưng lời khuyên này khiến tôi để nó chạy và các cảnh báo dừng lại sau một thời gian và quá trình chuyển đổi đã hoàn thành thành công. Cảm ơn.
IRTFM

58

Thông báo cảnh báo này xuất hiện khi cố gắng mã hóa nguồn tốc độ khung hình cao thành đầu ra tốc độ khung hình thấp, điều đó có nghĩa là các khung hình cần phải được loại bỏ.


Tôi gặp lỗi này vì tôi muốn chuyển đổi một loạt hình ảnh thành video:

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

Vấn đề dường như là, nếu không có tốc độ khung hình nào được đưa ra cho đầu vào, thì tốc độ khung hình là 25 khung hình / giây được giả sử:

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

Điều này cũng có thể được nhìn thấy trên tổng số khung được mã hóa. Tôi đã có 400 hình ảnh, nhưng lệnh trên chỉ được mã hóa 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%

Các thông báo lỗi biến mất bằng cách đặt tốc độ khung hình đầu vào thay vào đó nếu tốc độ khung hình đầu ra. Tốc độ khung hình đầu ra sau đó sẽ được chọn tự động là tốc độ khung hình đầu vào. Ngoài ra, trong các phiên bản ffmpeg mới hơn, bạn phải coi chừng, bởi vì khi sử dụng hình ảnh PNG với -itùy chọn hoặc đúng hơn là image2hoặc v4l2định dạng đầu vào, bạn phải sử dụng -frameratethay vì -r, xem tài liệu cho -rtùy chọn .

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

Cũng có thể chỉ định tốc độ khung hình của cả đầu vào và đầu ra một cách riêng biệt:

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

Trong trường hợp này, chỉ 161/400 khung hình sẽ được mã hóa. Các khung khác tạm thời sẽ được loại bỏ. Ngoài ra, thông báo lỗi biến mất, tôi đoán để không làm chậm ffmpeg bằng cách spam vào thiết bị xuất chuẩn, xem:


3
"bởi vì chỉ khi sử dụng hình ảnh PNG với tùy chọn -i, bạn phải sử dụng -framerator thay vì -r" - điều này đã giải quyết hoàn toàn vấn đề của tôi, cảm ơn!
Ẩn danh

1
Khi cố gắng chuyển đổi một wmv sang mp4, sử dụng -rlàm việc trong khi sử dụng -frameratekhông.
1934286

+1 và tôi đề nghị di chuyển "tóm tắt" của bạn ở đầu. Hơn nữa, vì nó đã giải quyết trường hợp của tôi về việc chuyển đổi hình ảnh thành video và cố gắng loại bỏ tốc độ khung hình đầu ra và tăng tốc độ đầu ra. Tôi đã bắt đầu từ điều này 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"đến điều này mà không có thêm cảnh báo nào 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"(lưu ý -framerate 50thêm vào cho đầu vào)
el-teedee

49

Nhìn vào mã nguồn , dường như sự khác biệt giữa thời gian trình bày (pts) trong luồng đầu vào khác với luồng trong luồng đầu ra nhiều hơn giới hạn cố định được đặt thành 0,6.

Đoạn trích từ nguồn:

    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;
    }

Đây chỉ là một cái nhìn nhanh chóng, vì vậy xin vui lòng đào sâu hơn.


Có bất cứ điều gì chúng ta có thể làm để "khắc phục" vấn đề này, hoặc đặt rõ ràng các pts đầu ra không?
Baodad

1
Tôi không nhớ các chi tiết xung quanh vấn đề này, nhưng nếu "sửa", bạn có nghĩa là loại bỏ cảnh báo sau đó dựa trên mã trên, bạn có thể xem xét tùy chọn format_video_sync = VSYNC_DROPhoặc format_video_sync = VSYNC_PASSTHROUGHxem liệu một trong số đó có khả thi trong trường hợp sử dụng của bạn không.
Erik

Cảm ơn. Tôi phát hiện ra việc thiết lập tốc độ khung hình một cách rõ ràng bằng cách sử dụng công -rtắc "cố định" các cảnh báo này.
Baodad

1
Chỉ là một cái gì đó từ trải nghiệm cá nhân: Tôi gặp vấn đề về thư rác "quá khứ" và đã khắc phục điều đó bằng cách buộc tốc độ khung hình đầu vào bằng -r 25, nhưng sau đó tôi bắt đầu nhận được âm thanh không đồng bộ. Xóa tùy chọn -r và sử dụng "-async 1 -vsync 1" để ngăn chặn đồng bộ hóa âm thanh đã ngăn chặn sự cố âm thanh, nhưng spam "thời lượng quá khứ" dường như cũng không còn nữa.
Jason Lang

Trong phiên bản 4.1 trở lên, mức nhật ký đã được nâng cấp, do đó nó sẽ không xuất hiện ở cấp nhật ký mặc định.
Gyan


1

Lệnh nên thực sự là:

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

Không có tiền tố "-" cho tham số "im lặng", vì đó không phải là một tùy chọn, thay vào đó là một giá trị cho tùy chọn "-loglevel".

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.