Ich möchte zwei mp4-Dateien zusammenfügen, um eine einzige zu erstellen. Die Videostreams sind in h264 und die Audiodaten in aac codiert. Ich kann die Videos aus rechentechnischen Gründen nicht in ein anderes Format umcodieren. Ich kann auch keine GUI-Programme verwenden. Die gesamte Verarbeitung muss mit Linux-Befehlszeilenprogrammen durchgeführt werden. FFmpeg kann dies nicht für mpeg4-Dateien tun, daher habe ich stattdessen MP4Box verwendet:
MP4Box -add video1.mp4 -cat video2.mp4 newvideo.mp4
Leider ist der Ton völlig durcheinander. Ich dachte, dass das Problem war, dass das Audio in AAC war, also habe ich es in MP3 transkodiert und wieder MP4Box verwendet. In diesem Fall ist das Audio für die erste Hälfte von newvideo.mp4
(entsprechend video1.mp4
) in Ordnung , aber dann ist es kein Audio und ich kann auch nicht im Video navigieren.
Mein nächster Gedanke war, dass die Audio- und Videostreams einige kleine Abweichungen in ihrer Länge aufwiesen, die ich beheben sollte. Also habe ich für jedes Eingangsvideo die Video- und Audiostreams aufgeteilt und sie dann mit der Option -shortest in FFmpeg verbunden.
So lief ich für das erste Video:
avconv -y -i video1.mp4 -c copy -map 0:0 videostream1.mp4
avconv -y -i video1.mp4 -c copy -map 0:1 audiostream1.m4a
avconv -y -i videostream1.mp4 -i audiostream1.m4a -c copy -shortest video1_aligned.mp4
Ähnliches gilt für das zweite Video und dann verwendete MP4Box wie bisher. Leider hat das auch nicht geklappt. Der einzige Erfolg, den ich hatte, war, als ich die Videostreams separat (dh videostream1.mp4 und videostream2.mp4) und die Audiostreams (dh audiostream1.m4a und audiostream2.m4a) zusammengefügt und dann das Video und Audio in einer endgültigen Datei zusammengefügt habe. Die Synchronisation geht jedoch für die zweite Hälfte des Videos verloren. Konkret gibt es eine Verzögerung von 1 Sekunde für Audio und Video. Anregungen sind sehr willkommen.
quelle
Antworten:
Der beste Weg, dies zu tun, ist derzeit mit dem Concat-Demuxer . Erstellen Sie zunächst eine Datei mit dem Namen
inputs.txt
formatiert wie folgt:Führen Sie dann einfach diesen Befehl ffmpeg aus:
Siehe auch Verkettung in
ffmpeg
FAQ .Ich behalte hier die folgenden Informationen für alle, die ältere Versionen von ffmpeg verwenden.
Die neuesten Versionen von ffmpeg können dies: Sie müssen die Dateien zuerst in mpeg-Transportströme remuxen (ziemlich prozessorleicht, da nur das Containerformat geändert wird):
Wenn dies zu einem Fehler in Bezug auf h264 führt, müssen Sie möglicherweise Folgendes verwenden:
Sie müssen dies für jede Eingabedatei separat tun. Verwenden Sie zum Zusammenfügen der Dateien Folgendes:
Wenn das einen Fehler über AAC auslöst, müssen Sie möglicherweise verwenden
Wenn Ihr System Named Pipes unterstützt, können Sie dies tun, ohne Zwischendateien zu erstellen.
In drei separaten virtuellen Terminals müssen Sie Folgendes ausführen:
Wenn die Datei output.mp4 bereits vorhanden ist, werden Sie vom dritten ffmpeg gefragt, ob Sie sie überschreiben möchten. Dies geschieht jedoch nach dem Zugriff auf die FIFOs. Dadurch werden die ersten ffmpegs geschlossen. Stellen Sie daher sicher, dass Sie einen nicht verwendeten Namen für Ihre Ausgabedatei auswählen.
Dies funktioniert möglicherweise nicht, wenn Ihre Eingabedateien unterschiedlich sind. Ich glaube, dass Unterschiede in der Bitrate in Ordnung sind, aber die Bildgröße, Bildrate usw. müssen übereinstimmen.
quelle
*** THIS PROGRAM IS DEPRECATED *** This program is only provided for compatibility and will be removed in a future release. Please use avconv instead.
ist eine Botschaft, die ich jetzt beim Laufen seheffmpeg
avconv
Für MP4 war die einzige funktionierende Lösung, die ich gefunden habe, MP4Box von GPAC-Paket
oder Befehl ist
mit mencoder und avconv konnte ich es nicht zum laufen bringen :-(
quelle
Danke für das Script dvo. Es war ein großartiger Ausgangspunkt für mich. Ich hatte kein Problem mit der Verwendung von Named Pipes, also habe ich das Skript angepasst, um sie stattdessen zu verwenden. Außerdem habe ich es repariert, um mit Dateinamen mit Leerzeichen zu arbeiten. Die Ausgabe in Named Pipes "geht" erst, wenn Sie mit dem Lesen beginnen. Daher müssen Sie die anfänglichen Remux-Tasks vor dem letzten Aufruf von avconv mit einem & hinterlegen. Vergessen Sie außerdem nicht, -c copy zu verwenden, da sonst die gesamte Menge neu codiert wird.
quelle
Auf einem Mac (macOS 10.13 High Sierra) habe ich mit Erfolg Folgendes verwendet:
Sortieren Sie wie oben beschrieben neu, falls erforderlich (beachten Sie, dass ./ entfernt wurde - der Pfad verursachte, dass ffmpeg den unsicheren Dateinamenfehler verursachte).
Dann musste ich den Codec und die Bitrate entfernen, die für das Standard-MacPorts-ffmpeg angegeben wurden, um es zu mögen:
quelle
Hier ist ein Einzeiler, der alles noch einfacher macht. Es muss alles getan werden, um Ihnen endlich eine resultierende Videodatei zur Verfügung zu stellen. Prost!
quelle
Danke böse Suppe; Hier ist ein kleines Skript zur Automatisierung des Prozesses unter Verwendung der neueren
avconv
.Übrigens, Named Pipes funktionierten bei mir nicht (die Ausgabe an sie blieb hängen).
quelle
Habe großen Erfolg mit genossen
Möglicherweise müssen Sie mylist.txt etwas neu anordnen
ffmpeg Version 2.2.3
quelle