FFMPEG Concatenate Videos

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von DTF.

    FFMPEG Concatenate Videos

    Hi,

    ich möchte mit FFMPEG .mp4 Video Files aneinander hängen ... die Files stammen von ein und denselbem Cell Phone. Ich erstelle eine Liste der Files und dann führe ich folgendes Kommando aus:

    ffmpeg -safe 0 -f concat -i C:\myFolder\$VideoConcat\Templist.txt -c copy C:\myFolder\$VideoConcat\Output.mp4

    Die Ausgabedatei wird erstellt ... aber egal welche Reihenfolge der Files ich einstelle, ich erhalte die Fehlermeldung:

    [concat @ 0000023cde6d9d00] DTS 261168 < 486681 out of order [mp4 @ 0000023cde7aae00] Non-monotonous DTS in output stream 0:0; previous: 486681, current: 261168; changing to 486682. This may result in incorrect timestamps in the output file.

    und danach folgen seitenlang Fehlermeldungen der immer gleichen Art:

    [mp4 @ 0000023cde7aae00] Non-monotonous DTS in output stream 0:0; previous: 486682, current: 262192; changing to 486683. This may result in incorrect timestamps in the output file.
    [mp4 @ 0000023cde7aae00] Non-monotonous DTS in output stream 0:0; previous: 486683, current: 263216; changing to 486684. This may result in incorrect timestamps in the output file. ...

    Die Ausgabedatei lässt sich zwar abspielen ... aber hängt zwischendurch ... und bricht dann irgendwann gänzlich ab.

    Diese Fehler erhalte ich, selbst wenn ich nur zwei Dateien verknüpfe, egal in welcher Reihenfolge.

    Einzeln lassen sich die zu vernknüpfenden Dateien problemlos abspielen.

    Es sei angemerkt, dass ich durchaus die Verketteung der Dateien fallweise nicht in zeitlicher Reihenfolge vornehmen möchte.

    Nach endlosen Versuchen bin ich irgendwie am Ende mit meinem Latein. FFMPEG ist zweifelsohne ein tolles Programm ... aber wie mir scheint ist die Parametereingabe "waffenscheinpflichtig".

    Kann mir jemand (nachsichtig) auf die Sprünge helfen.

    LG
    Peter

    *Topic verschoben*

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    Hattest Du den stackoverflow-Artikel darüber gesehen? In der 2. Antwort steht was von wegen gleiche Timestamps als Problemursache. Aber auch die erste Antwort sollte hergenommen werden (Anzeige der Dateidaten mithilfe von ffprobe Videodateipfad). Zum Ausschluss von Codec-Unterschieden.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Kannst du mal 2 Videos irgendwo hochladen und einen Link posten? Nimm einfach 2 auf, wo nix privates drauf zu sehen ist. Kann aber auch sein, das deine Videos eine Macke haben. Re-Encode die mal und versuche es mit diesen Dateien.

    Evtl. kann es reichen, wenn du das flag igndts verwendest.
    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D
    Kann man bei ffmpeg evtl. Parameter mitgeben das die Input-Dateien intern erst zu einem X-Format decodiert und davon neu encodiert in der neuen Datei landen? So würde ich vorgehen, wenn ich die MediaFoundation dafür nutzen würde und die Ausgangsdateien in unterschiedlichen Formaten vorliegen.
    Mfg -Franky-

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „-Franky-“ ()

    @DTF Das ist ein wenig unglücklich das das mit ffmpeg nicht direkt funktioniert. Das mit dem Umweg ist zwar eine Möglichkeit, dauert dann aber auch doppelt so lange.

    Vllt hat ja mal hier wer Lust sowas per MediaFoundation oder WinRT zu programmieren. Die WinRT nutzt unter der Haube auch die MediaFoundation, ist aber vom Aufwand her einfacher. Erspart einem auch das aufrufen einer externen Anwendungen und man hat gleich entsprechende Events für den Fortschritt.
    Mfg -Franky-

    -Franky- schrieb:

    Das mit dem Umweg ist zwar eine Möglichkeit, dauert dann aber auch doppelt so lange.


    Nicht unbedingt doppelt so lange, das zusammenfügen sollte schneller gehen, denn da muss ja nicht mehr re-encoded werden. Da nimmt man dann bei Video- und Audio-Codec copy. Wie bei einem Remux.
    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D

    DTF schrieb:

    Nicht unbedingt doppelt so lange, ...
    Ok, war von mir falsch formuliert. <- Zu früh am Morgen und noch kein Kaffee intus. ;( Was ich eigentlich sagen wollte, es wären zwei Schritte notwendig. :D

    Öhm, @Peter329 Du hattest doch hier schon einen Weg gefunden: Concatenate .mp4 Files
    Mfg -Franky-

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „-Franky-“ ()

    Hi an alle,

    erst mal recht herzlichen Dank für eure Beiträge. Inzwischen habe ich ein bissl Basisforschung betrieben.

    1. Ich hatte die Verkettung von .mp4 Dateien hier schon mal thematisidert. Die Lösung hat auch prima funktioniert. Nur funktioniert sie halt nicht mit den hier vorliegenden Dateien.

    2. Ich habe 13 Dateien, die alle mit demselben Cell Phone aufgenommen wurden. Egal in welcher Reihenfolge ich die verknüpfe, ich erhalte die Fehler und das AusgabeVideo läuft nicht richtig (bleibt hängen, bricht vorzeitig ab).

    3. Ich habe jetzt herausgefunden, dass sich die Videos in zwei Gruppen aufteilen lassen:

    Gruppe 1: Video 3, 12 und 13
    Gruppe 2: Video 1, 2, 4 - 11

    Beide Gruppen lassen sich getrennt voneinenander problemlos aneinander hängen und die Ausgabe Videos laufen auch vollkommen richtig!

    Sobald man aber auch nur einen einzigen File mischt, also etwa Video 3 und 4 ... dann erhält man die Fehlermeldungen und das Ausgabevideo läuft nicht mehr.

    Fazit: Ich denke die Videos sind nicht defekt, sondern es liegt irgend eine Unverträglichkeit vor. Ich habe deshalb die Metadaten von jeweils 2 Files einer Gruppe extrahiert. Und siehe da, es gibt Gemeinsamkeiten innerhalb der Gruppe und Unterschiede zwischen den Gruppen (s. Anhang):

    1. Die Reihenfolge der Handler ist vertauscht. (Sound Handler, Video Handler)

    2. Die Stream Angabe ist vollkommen unterschiedlich (was ja auch plausibel ist, weil das verschiedene Handler sind).

    Vielleicht ist einem der Experten ja jetzt klar, was hier schief läuft!

    Mir scheint das vorgeschlagene Vorgehen, die Videos erst einmal zu "normalisieren" und dann zu verketten recht erfolgversprechend ... die längere Laufzeit wäre mir dabei ziemlich egal.

    Wie sollte denn der FFMPEG Befehl zur Normalsierung zweckmäßigerweise lauten ?

    LG
    Peter
    Dateien

    Peter329 schrieb:

    Die Reihenfolge der Handler ist vertauscht. (Sound Handler, Video Handler)


    Das ist egal. MP4 ist ein sogenanntes Containerformat. Ob nun Stream 0:0 oder 0:1 Audio, Video, Untertitel oder Bild ist. Sorg mal dafür das alle Videos die gleiche Anzahl an Frames(FPS) haben. Das ist der einzige Unterschied(abgesehen von den "vertauschten" Spuren) den ich gerade sehe.

    Peter329 schrieb:

    Wie sollte denn der FFMPEG Befehl zur Normalsierung zweckmäßigerweise lauten ?


    Ausgangssituation:
    Ein Ordner, alle Dateien zum ändern sind da drin, eine BAT datei auch, damit man nicht für jedes Video eine Zeile tippen muss. FFMPEG ist bei mir in der PATH Variable, deshalb kann ich einfach nur ffmpeg schreiben, anstatt den ganzen Pfad.

    Das dann in die Batch und diese dann starten. Danach sollten sich alle verketten lassen. Das kannst du dann z.B. in Zeile 3 machen. Pause in Zeile 4, damit die Console auf bleibt und man sehen kann ob was nicht richtig war.

    Quellcode

    1. @echo off
    2. for %%f in (*.mp4) do ffmpeg -i %%f -c:v libx264 -crf 18 -preset slow -c:a copy -vf fps=fps=60 %%f.edit.mp4
    3. pause


    Solltest du versuchen das selbst ins Terminal zu tippen, dann nur ein % anstatt wie im Batchcode 2.

    PS:
    Aber auch bei der Tonspur sehe ich gerade unterschiede, 191 und 192 kb/s. Sollte es nicht an den FPS liegen, reencode auch mal die Audio Spur, anstatt die Videospur oder beides. DTS hat ja mit Audio zu tun, das könnte es sogar eher sein, wie die FPS.

    Hier auch noch mal mit änderung von Video-FPS und Audio Bitrate:

    Quellcode

    1. @echo off
    2. for %%f in (*.mp4) do ffmpeg -i %%f -c:v libx264 -crf 18 -preset slow -b:a 192k -vf fps=fps=30 %%f.edit.mp4
    3. pause



    Probier evtl. auch mal nur die Audio Bitrate zu ändern, denn das denke ich ist das problem hier. Sind ja immerhin 1000 bits Unterschied pro Sekunde.
    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „DTF“ ()

    Die erste Konvertierung von @DTF hat das gewünschte Ergebnis gebracht !

    Die Konvertierung der 13 Dateien läuft zwar ein Weilchen aber dafür ist der anschließende Concat jetzt im Handumdrehen "durch". Vorher hat der ebenfalls einige Zeit benötigt. Die konvertierten Files sind wesentlich kleiner (ca. halb so groß wie das Original) ... ohne dass ich an der Qualität der Videos Einbußen festgestellt habe.

    Die Fehler sind verschwunden! :)

    Und noch ein weiteres Problem ist "en passant" gelöst - das hatte ich bisher noch gar nicht gepostet - weil ich immer erst mal EIN Problem einstelle. :)

    Zur Info für alle die es interessieren könnte:

    Die Videos wurden "Landscape" aufgenommen ... also mit waagrecht gehaltenen Cell Phone. Das kann man allerdings links- oder rechtsherum drehen ... das erkennt man an:

    Metadata:
    rotate : 180

    Für einen einzelnen File spielt das keine Rolle ... beim Verketten aber wird die Orientierung offensichtlich aus dem ERSTEN File für alle folgenden Files übernommen ... und damit stehen dann möglicherweise einige Videos auf dem Kopf !

    Aber wie schon gesagt: auch dieses Problem wird durch die "Normalisierung" behoben ! Die Rotate Eintragung ist verschwunden und alle Files werden mit der richtigen Drehung angezeigt !

    Probleme gelöst ! Uff !

    Vielen Dank an die Ratgeber. Ohne eure Expertise hätte ich das Ding nicht gebacken bekommen !

    Have a nice day
    Peter
    Jau, da gibt es wohl jede Menge Optionen .... -lossless 1 - quality 100 -preset xxxx (wobei mir nicht so ganz klar ist, was man hier für xxxx auswählen sollte), etc.. etc.

    Den Parameter -crf habe ich in der Doku nicht gefunden (der String ist nicht in der HTML Seite der FFMPEG Doku enthalten) ...

    Ganz offen gestanden fehlt mir dann das Verständnis, was nützlich wäre, wie sich Kombinationen auswirken etc.

    Ich wäre sehr dankbar für ein Beispiel, wie man ein möglichst "lossless" Ergebnis mit vertretbarem Aufwand erhalten kann. Ich will ja eigentlich nur meine Files aneinander hängen ohne gleich eine Diplomarbeit über FFMPEG zu schreiben. :)

    LG
    Peter
    Also absolut lossless wäre bei Audio und Video copy, das klappt ja hier in dem Fall nicht. CRF = ConstantRateFactor, -crf 0 wäre "lossless".

    Aber ich brauch ja jetzt nicht schreiben was woanders schon geschrieben steht. Auch Informationen zu -preset findest du da.
    trac.ffmpeg.org/wiki/Encode/H.264
    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D