Angabe von Parametern zum Erstellen von Videos für den concat-Demuxer von ffmpeg (um eine große Neucodierung zu vermeiden)

1610
bertieb

ffmpegkann verwendet werden, um Dateien miteinander zu verketten :

Wenn Sie Mediendateien mit genau denselben Codec- und Codec-Parametern haben, können Sie sie verketten [...]

(Hervorhebung meines ) Meine Absicht 1 ist es, Mediendateien mit dem gleichen Codec und denselben Parametern zu erstellen, sodass ich concat nutzen kann, ohne eine lange Neucodierung durchzuführen.

Präambel:

Ich habe eine Datei, aus der ich nützliche Teile schneiden und aufbewahren möchte. Ich habe ein Python-Skript geschrieben, um den nächstgelegenen Keyframe zum gewünschten Schnittpunkt zu finden und dort zu schneiden, da ffmpeg bei einer Stream-Kopie nur I-Frames verwenden kann:

Die Verwendung der Option -ss als Eingabeoption zusammen mit der Option -c: v copy ist möglicherweise nicht genau, da ffmpeg nur für i-Frames verwendet / aufgeteilt werden muss.

Es kommt vor, dass die Splits nicht genau im richtigen Moment stattfinden, aber nahe genug für den Moment sind, dass ich mich auf einen anderen Teil der Gleichung konzentrieren kann. Wenn ich den concatDemuxer an dieser Stelle benutze, werden die verschiedenen Teile perfekt zusammengefügt - soweit gut!

Ich möchte jedoch, dass glatte Übergänge zwischen diesen Segmenten vorhanden sind. Daher habe ich diese Segmente weiter aufgeteilt, so dass die kurzen Enden verwendet werden können, um einen Crossfade-Übergang zu erstellen, ohne den gesamten Dateisatz neu codieren zu müssen.

Ein einfaches Diagramm würde dies wahrscheinlich veranschaulichen:

 [111AAAA111BBBBB111111CCCCCCC1111DDDDD111] | (original file) [AAAA] [BBBBB] [CCCCCCC] [DDDDD] | (desired clips extracted) [AAA] [A][B] [BBB] [B][C] [CCCCC] [C][D] [DDDD]| (split ends from clips) [AAA][ab][BBB][bc][CCCCC][cd][DDD] | (transitions between short ends) [AAAabBBBbcCCCCCcdDDD] | (intended output) 

Problem:

Hier bin ich hingegangen. Wenn ich ffmpegden concatDemuxer zum Zusammenfügen der obigen Clips verwendet habe, werden bei der Wiedergabe bedeutende Video- und Audio-Artefakte angezeigt . Meine Vermutung ist, dass die Codec-Parameter nicht übereinstimmen, wie oben erwähnt. Wenn Sie also das Video überprüfen, erhalten Sie Folgendes ffprobe:

$ ffprobe -i ab-transition.mkv 2>&1 | grep Stream.*Video ; ffprobe -i B.mkv 2>&1 | grep Stream.*Video Stream #0:0: Video: h264 (Main), yuv420p(tv, bt709/bt709/iec61966-2-1), 1280x720, SAR 1:1 DAR 16:9, 62.50 fps, 62.50 tbr, 1k tbn, 120 tbc (default) Stream #0:0: Video: h264 (Main), yuv420p(tv, bt709/bt709/iec61966-2-1), 1280x720 [SAR 1:1 DAR 16:9], 62.50 fps, 62.50 tbr, 1k tbn, 125 tbc (default) 

(Ich habe die Audio-Stream-Ausgabe weggelassen, da die Streams angeblich die gleichen Parameter haben, das Audio jedoch nicht korrekt verbunden ist.)

Es gibt Unterschiede. Ich habe die verwendet -show_streams, um detailliertere Informationen zu erhalten, die unter http://pastebin.com/4vcnDYtj verfügbar sind (einzelne Leerzeile, die 2 Ausgänge trennt). diffDie Ausgabe ergibt:

7c7 < codec_time_base=1/120 --- > codec_time_base=1/125 70,71c70,71 < start_pts=12 < start_time=0.012000 --- > start_pts=11 > start_time=0.011000 

Aktualisieren:

Ich habe Optionen und übereinstimmende Parameter für alles gefunden, was ich außer der Codec-Zeitbasis (TBC) sehen kann. Gibt es eine Einstellung, mit der ich codec_time_base (tbc) setzen kann ? Einstellung -rhat keine Auswirkung.

Update 2: Aus Angst, dass diese Frage für SU zu Nische war, stellte ich die Frage der ffmpeg-Benutzer-Mailingliste. Leider -time_baseist in diesem Fall keine geeignete Encoder-Option:

Dies ist eine Option für FFmpeg-interne Encoder, die Sie für einen externen Encoder (x264) verwenden möchten.

Und als ich nach der allgemeinen Machbarkeit fragte, war die Antwort leider

Ich denke nicht, dass das möglich ist.

Ich habe um Klarstellung und Möglichkeiten für die ursprüngliche Codierungssoftware gebeten - in diesem Fall OBS-, die hinsichtlich der Optionsspezifikation möglicherweise weniger flexibel ist als ffmpegaufgrund der Spezifikationen des Live Stream-Consumer-Formats (Twitch). Ich habe noch keine Antwort von der Mailingliste erhalten, habe aber auch in den OBS-Foren nachgefragt.

Entscheidend ist, dass das Controlling für mich die Möglichkeit concatbietet, den Demuxer ffmpegzu verwenden, um diese zu verbinden, ohne dass ein langer Codierungsprozess erforderlich ist . Vielen Dank im Voraus.

(Mir ist klar, dass dies eine Wand aus anderthalb Seiten ist, also sind Ergänzungen, Subtraktionen oder Klarstellungsvorschläge natürlich willkommen. Ich würde auf weitere offizielle Informationen verweisen, aber da ich <10 Wiederholungen habe, kann ich nicht mehr als 2 Links einfügen! )


1 : Weitere Informationen finden Sie in meiner verwandten Frage: Wie werden Videoclips mithilfe von kurzen Übergängen effizient und automatisch verbunden?

2
Noch nicht aufgeben. ;-) Mir ist klar, dass dies gegen Ihre Absichten ist, aber haben Sie die letzte Concat-Operation mit Codierern anstelle von Codec-Kopien ausprobiert, um zu sehen, ob die A / V-Artefakte dadurch beseitigt werden? Könnten Sie bitte zumindest die vollständigen ffmpeg-Befehle posten, mit denen Sie Ihre Clips und Übergänge generieren? Mr. What vor 9 Jahren 1
@ Mr.What froh, es zu hören- Ich habe weit und breit Fragen gestellt (laut Update). Die Verwendung von Codec-Optionen führt zu einem endgültigen Transcode. aber sollte die Artefakte beseitigen, wie Sie sagen. Ich bin mir ziemlich sicher, dass ich das in den vielen Stunden, die ich verbracht habe, getestet habe! Ich kann zwar sicher Befehle posten, aber die Übergänge werden wie bei meiner anderen (verknüpften) Frage über die Schmelze (MLT) generiert. Niemand, den ich gefragt habe, scheint in der Lage zu sein, die Zeitbasis zu ändern. Selbst wenn ich es von der Quellenseite (OBS) aus anpacke, wird die x264-Option -time_base dort ignoriert! bertieb vor 9 Jahren 0
Weiter unten in der Dokumentation gibt es einen Filter [`settb`] (http://ffmpeg.org/ffmpeg-all.html#settb_002c-asettb), der möglicherweise einen Versuch wert ist, da er außerhalb des x264-Encoders angewendet würde. - `ffmpeg input.ext -vf" settb = Ausdruck = 1/125 "-c: v libx264 usw. output.ext`. Oder wurde dies bereits in Ihren Reisen erwähnt / versucht? Mr. What vor 9 Jahren 1
@ Mr.What Dieser Filter sah vielversprechend aus, aber das Transkodieren einer Datei mit der Zeitbasis 125 konnte nicht die gewünschte Zeitbasis von 120 (oder eine andere) erzeugen, obwohl sie sich stark über * "vergangene Dauer 0.874992 (etc) zu groß" beschwert hat *: - / Gutes Denken aber! Der Plot wird durch Handzählung weiter verdickt, die Originaldateien scheinen bei der Wiedergabe 60 Frames pro Sekunde zu haben (nicht 62-63). Nicht sicher, ob dies auf die Zeitbasis zurückzuführen ist, die dazu führt, dass der Player Frames ignoriert. Hier geht es tief ins Kaninchenloch! bertieb vor 9 Jahren 0
Nun, das Oddball-FPS und die Timebase passen mit dem Codec-Kopieren in die Ausgabe für Ihre nicht-vorübergehenden Clips zusammen. Es gibt also keine wirkliche Überraschung. Ich frage mich, ob die Verwendung von "-copyinkf" (die führende Nicht-Keyframes in der Ausgabe "-c copy" enthält) beim abschließenden Concat hilfreich sein könnte, und ob es sich auch lohnen würde, den verschlüsselten Übergangsclip bei a zu erzwingen Rationale Framerate durch `libx264`. Versuchen Sie, die Clips "a" und "b" zu experimentieren, indem Sie -copyinkf -c: v copy -c: eine Kopie verwenden. Clip mit `libx264 -r 60`, dann diese drei zusammenfassen und sehen, ob es einen Unterschied gibt. Mr. What vor 9 Jahren 0
@bertieb Hast du deine Antwort schon gefunden? Oder ist es unmöglich! Ich bin mit einem ähnlichen Problem konfrontiert, bei dem aufgrund der Größenänderung eines der Clips letztendlich alle neu codiert werden müssen, um sie ordnungsgemäß zu verketten. Rohan vor 9 Jahren 0
@ Rohan ja und nein. Ich habe damit umgegangen, indem ich die Übergänge, die ich erstellt habe, geändert habe - Fade-to-Black im Gegensatz zu Crossfade -, aber dies vermeidet das Problem, anstatt sich damit zu befassen. Ich habe den Parameter in `ffmpeg` gefunden, der die gemeldete Zeitbasis kontrollierte (etwas anders als` -time_base` Antwort unten!), Hatte aber auf keinen Fall den richtigen Effekt: - / bertieb vor 9 Jahren 0

1 Antwort auf die Frage

1
Mr. What

Je nach den generischen Codec-Optionen können Sie -time_baseden libx264-Encoder-Satz während der Erstellung der Übergangsclips hinzufügen .

Wenn ich Ihre Dateivergleiche richtig lese, zeigt ab-transition.mkv einen Tcb von 1/120, während B.mkv 1/125 anzeigt (was ist der gewünschte Wert, oder?) - würde ich vorschlagen Fügen Sie auch einen -rWert hinzu, um sicherzustellen, dass sowohl die Framerate als auch die Zeitbasis eingehalten werden:

-c:v libx264 [preset & crf/qp settings] -r 62.50 -time_base 1/125 [output] 

Als Randbemerkung möchte ich erwähnen, dass meine eigenen Versuche, den concat-Demuxer zu verwenden, ohne die Ausgabedatei (en) vollständig neu zu kodieren, immer zu Problemen geführt haben, hauptsächlich Audiosynchronisation und Frame-Drop. Die besten Ergebnisse wurden durch die Kodierung separater Clips mit verlustfreiem Audio und Video erzielt, um die Originalqualität zu erhalten ...

-c:v -libx264 -preset ultrafast -qp 0 -c:a pcm_s16le 

... dann die endgültige Datei mit den gleichen Audio- / Videoeinstellungen codieren, mit denen die Quellvideos erstellt wurden.

@mr-was danke dir für die Antwort, und du denkst genauso wie ich. Leider hat weder `-time_base` noch` -r` die richtige Wirkung. Ich werde das OP mit mehr Details aktualisieren. bertieb vor 9 Jahren 0