ffmpeg: concat Führt zu „Buffer queue overflow“ und Short Audio

Ich habe diese Videodatei, die an einer Stelle eine Asynchronität von ~ 1 Sekunde einführt. Also habe ich versucht, es zum Laufen zu bringen, indem ich an dieser Stelle ein kurzes Segment dupliziert habe, da es dort still ist:

$ ffmpeg -i DFW.mp4.mkv -filter_complex '
[0:a] aselect=n=3:e=lt(t\,18*60+42.100)+gt(t\,18*60+41)*2 [as] [ae] [am];
[am] asplit [am1] [am2];
[as]  asetpts=PTS-STARTPTS [as];
[am1] asetpts=PTS-STARTPTS [am1];
[am2] asetpts=PTS-STARTPTS [am2];
[ae]  asetpts=PTS-STARTPTS [ae];
[as] [am1] [am2] [ae] concat=n=4:a=1:v=0 [a]' -map 0:v -map '[a]' -c:v copy DFW-1.mp4

Mit anderen Worten, ich habe

  • asBeginn bis 18:41.000
  • aeEnde ab 18:42.100
  • amder Mittelteil zwischen 18:41.000 und 18:42.100, der einmal wiederholt werden soll

Die Segmentierung funktioniert, der verkettete Hörteil klingt gut. Stellt sich jedoch aeals nur ~5 Sekunden heraus und ffmpegbeginnt spammige "Buffer queue overflow, dropping"-Zeilen zu drucken. Das gesamte Video ist 1h30 lang und lässt mich bis zum Ende mit viel Stille zurück.

Mit anderen Worten, Video und Audio sind bis etwa 18:48.000 in Ordnung und die restlichen 1h11 des Videos haben keinen Ton.

Warum ist ffmpegdas so und wie kann ich es beheben?

Ich habe auch versucht, stattdessen ein stilles Audiosegment als Plan B einzufügen, aber es ist fehlgeschlagen.

Ein Pufferüberlauf tritt auf, wenn ein Filter mit mehreren Eingaben auf eine oder mehrere verspätete Eingaben wartet. Die bereits in die Warteschlange eingereihten Eingaben haben eine Frame-Drop-Schwelle, die überschritten wird, wenn diese Eingaben ausreichend spät sind. Was ist falsch daran, einfach ein leeres Segment hinzuzufügen?
@Mulvya Nun, ich habe es versäumt, eine zu erstellen/zu verwenden. Mein Problem würde es aber lösen. -- Aber andererseits weiß ich nicht, warum ffmpeg nach fünf Sekunden stoppt. Ich würde sagen, entweder den gesamten Rest des Streams verwenden oder gar nichts. Ist aejedoch ~5 Sekunden lang, was seltsam ist.

Antworten (1)

Unter der Annahme, dass das Audio keine Zeitstempelunterbrechungen enthält, sollten ein einfaches atrim und ein Nullsegment funktionieren.

ffmpeg -i DFW.mp4.mkv -filter_complex '
[0:a]asplit[a][b];
[a]atrim=0:1122.1[pre];
[b]atrim=1122.1,asetpts=PTS-STARTPTS[post];
anullsrc,atrim=0:1.1[seg];
[pre][seg][post]concat=n=3:a=1:v=0[a]' -map 0:v -map '[a]' -c:v copy DFW-1.mp4
Ah, also so wird das gemacht. Cool.
Nach dem Einfügen von fünf Pausen wie dieser fängt ffmpeg wieder an, sich über "Buffer queue overflow, dropping" zu beschweren
Was ist dein neuer Befehl?
Ich benutze genau die gleiche Weise wie Sie. Ich ändere nur die Positionen in den atrims.
Wie in mehreren Befehlen? Oder zusätzliche Filter in einem einzigen Befehl?
Nun, ich habe Ihren Anruf entgegengenommen und ihn mehrmals mit unterschiedlichen Werten für das atrims ausgeführt.
Immer noch nicht klar. Mehrfach- oder Einzelbefehl?
Wieder genau das, was Sie in Ihrer Antwort gepostet haben. Wie auch immer, uns wurde gesagt, dass wir einen vollständigen Audiostream von einer anderen Quelle erhalten und das hoffentlich auf das gesamte Video anwenden können.