Che cosa significa "Durata passata X.XXX troppo grande"?


142

Quando codifico H.264 usando ffmpeg ottengo il seguente tipo di avvertenze in massa:

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

Cosa vogliono dire? Non ho trovato nulla di chiaro online o nella documentazione di ffmpeg.


2
Si prega di indirizzare le domande di ffmpeg alla beta di video.stackexchange.com . Vedi la descrizione del tag ffmpeg.
Ondra Žižka,

34
@Ondra Anche un altro stackexchange? Mi sto confondendo con quei oltre 100 siti secondari, non sono sicuro che si tratti di una direzione positiva verso cui sta andando stackexchange.
mxmlnkn,

1
@mxmlnkn Sono d'accordo, ti fa desiderare tempi più semplici ... :)
Erik

4
Penso che sia. StackOverflow è per la programmazione, questa non è programmazione. Esiste un sito di domande e risposte per l'elaborazione video, questa è una domanda sull'elaborazione video. Cosa non capire?
Ondra Žižka,

Leggi anche la descrizione del tag.
Ondra Žižka,

Risposte:


23

Stavo ricevendo migliaia di questi avvisi con una codifica particolare. Stavo ridimensionando il video da 1080p a 480p. In un punto di modifica, dove c'erano dei video poco chiari a causa di un difetto del laserdisc sorgente, questi messaggi iniziarono a comparire e poi apparvero per ogni fotogramma da quel momento in poi. Continuarono all'infinito, come questo breve estratto:

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

L'invocazione originale di ffmpeg era questa:

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

Seguendo i suggerimenti qui ho prima aggiunto -framerate 60000/1001 all'input. Ciò non ha migliorato nulla. Ho mantenuto -framerate e aggiunto -r 60000/1001 all'output. Ciò non ha ancora migliorato nulla. Mantenendo entrambi ho aggiunto infine -async 1 -vsync 1. Questo mi ha portato a ricevere un singolo avviso, e questo è tutto. Quell'invocazione era:

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

L'unica differenza che ho riscontrato in un dump dettagliato di MediaInfo è stata la rimozione di questa riga trovata nell'invocazione originale ma non nella seconda:

Delay relative to video                  : -33ms

Tuttavia, ho controllato la sincronizzazione A / V vicino all'inizio dei file e vicino alla fine, e non c'era alcuna differenza percepibile nella sincronizzazione tra i due file. Anche i loro tempi di funzionamento erano gli stessi, ma questo era misurato solo al secondo più vicino, in VLC. Quindi ho controllato i conteggi dei frame usando ffmpeg in questo modo:

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

e cercando "frame = #" vicino alla fine dell'output.

Si scopre che il video di origine era lungo 375226 fotogrammi, l'invocazione originale produceva 375195 fotogrammi e la seconda invocazione produceva 375200. Quindi la seconda invocazione, con un numero notevolmente inferiore di messaggi di avvertimento, ha anche perso 5 fotogrammi in meno.

I test successivi hanno dimostrato che -framerate e -r non erano necessari e che era sufficiente usare solo i due flag di sincronizzazione. Ciò ha prodotto risultati identici alla seconda invocazione sopra, quindi la terza e più semplice invocazione che ho trovato per risolvere il problema è questa:

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

E ancora un altro file successivamente ha prodotto una serie di questi avvisi anche con i flag di sincronizzazione, ma aggiungendo nuovamente i flag di tasso "risolto" (ha prodotto solo due anziché migliaia di avvisi). Quindi a volte la seconda invocazione funziona quando la terza no. Per i miei scopi immediati mi accontenterò della seconda invocazione e spero che risolva la maggior parte di questi problemi.

Tutto questo con ffmpeg versione 4.0.


2
Grazie per questo! Dopo giorni di problemi, -async 1 -vsync 1risolto il problema per me.
Offek,

1
Grazie per questa analisi @larryy molto utile
deepelement il

90

Uno dei manutentori del progetto DVDStyler su SourceForge ha detto questo a riguardo:

Le versioni di FFMpeg successive al 15 gennaio 2015 mostrano spesso questo avviso. È stato aggiunto per avvisare della possibile distorsione del controllo della frequenza, altrimenti non provoca alcun danno.


la "distorsione del controllo della frequenza" è correlata alla codifica (principalmente video) e non ha alcuna relazione con questo avviso, che riguarda il fatto che il timestamp di output differisca troppo (relativamente) rispetto al timestamp di input
Gyan

Le prime volte che ho ricevuto l'avviso ho terminato la conversione, ma questo consiglio mi ha permesso di lasciarlo funzionare e gli avvisi si sono interrotti dopo un po 'e la conversione è stata completata correttamente. Grazie.
IRTFM,

58

Questo messaggio di avviso viene visualizzato quando si tenta di codificare una sorgente con frame rate elevato in un output con frame rate basso, il che significa che i frame devono essere eliminati.


Ho avuto questo errore perché volevo convertire una serie di immagini in un video:

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

Il problema sembra essere che se non viene fornita una frequenza fotogrammi per l'input, si presume una frequenza fotogrammi di 25 fps:

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

Questo può essere visto anche sul numero totale di frame codificati. Avevo 400 immagini, ma il comando sopra codificato solo 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%

I messaggi di errore scompaiono impostando invece la frequenza dei fotogrammi di input se la frequenza dei fotogrammi di output. La frequenza dei fotogrammi di uscita verrà quindi automaticamente scelta come quella dell'input. Inoltre nelle versioni più recenti di ffmpeg devi fare attenzione, perché quando usi immagini PNG con l' -iopzione o piuttosto il formato di input image2o v4l2, devi usare -framerateinvece di -r, vedi la documentazione per l' -ropzione .

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

È anche possibile specificare la frequenza dei fotogrammi di input e output separatamente:

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

In questo caso verranno codificati solo 161/400 frame. Gli altri frame intermedi verranno eliminati. Anche il messaggio di errore scompare, suppongo che per non rallentare ffmpeg dallo spamming a stdout, vedi:


3
"perché solo quando usi immagini PNG con l'opzione -i, devi usare -framerate invece di -r" - questo ha risolto completamente il mio problema, grazie!
Anonimo il

1
Nel tentativo di convertire un wmv in mp4, usare ha -rfunzionato dove -frameratenon è stato usato .
1934286,

+1 e ti suggerisco di spostare il tuo "riassunto" in alto. Inoltre, come ho risolto il mio caso di convertire immagini in video e cercare di aumentare il framerate di output e accelerare anche l'output. Ho iniziato da questo 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"a questo senza più avvertimenti 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"(nota l' -framerate 50aggiunta per input)
el-teedee,

49

Osservando il codice sorgente sembra che la differenza tra il tempo di presentazione (punti) nel flusso di input differisca da quello nel flusso di output di oltre un limite fisso impostato su 0,6.

Snippet dalla fonte:

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

Questa è solo una rapida occhiata, quindi sentiti libero di scavare più a fondo.


C'è qualcosa che possiamo fare per "risolvere" questo problema o impostare esplicitamente i punti di output?
Baodad,

1
Non ricordo i dettagli che circondano questo problema, ma se per "correzione" intendi eliminare l'avvertimento, in base al codice sopra puoi esaminare l'opzione format_video_sync = VSYNC_DROPo format_video_sync = VSYNC_PASSTHROUGHvedere se uno di questi è praticabile nel tuo caso d'uso.
Erik,

Grazie. Ho scoperto esplicitamente l'impostazione della frequenza dei fotogrammi usando l' -rinterruttore "riparato" questi avvisi.
Baodad

1
Solo qualcosa per esperienza personale: ho avuto il problema dello spam nei messaggi di "durata passata" e l'ho risolto forzando la frequenza dei fotogrammi di input con -r 25, ma poi ho iniziato a ottenere l'audio fortemente non sincronizzato. La rimozione dell'opzione -r e l'utilizzo di "-async 1 -vsync 1" per impedire la desincronizzazione dell'audio ha impedito il problema audio, ma sembra che anche lo spam "durata passata" sia sparito.
Jason Lang,

Nella v 4.1 e successive, il livello di registro è stato aggiornato, quindi non verrà visualizzato al livello di registro predefinito.
Gyan il


1

Il comando dovrebbe effettivamente essere:

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

Non esiste un prefisso "-" per il parametro "quiet", in quanto non è un'opzione, piuttosto un valore per l'opzione "-loglevel".

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.