Ich versuche zwei mp4-Dateien mit ffmpeg zu verketten. Ich brauche dies, um ein automatischer Prozess zu sein, deshalb habe ich mich für ffmpeg entschieden. Ich konvertiere die beiden Dateien in .ts-Dateien und verkette sie dann und versuche dann, diese verkettete .ts-Datei zu codieren. Die Dateien sind h264 und aac-codiert und ich hoffe, dass die Qualität gleich bleibt oder dem Original so nahe wie möglich kommt.
ffmpeg -i part1.mp4 -vcodec copy -vbsf h264_mp4toannexb -acodec copy part1.ts
ffmpeg -i part2.mp4 -vcodec copy -vbsf h264_mp4toannexb -acodec copy part2.ts
cat part1.ts part2.ts > parts.ts
ffmpeg -y -i parts.ts -acodec copy -ar 44100 -ab 96k -coder ac -vbsf h264_mp4toannexb parts.mp4
Leider wird beim Codieren die folgende Fehlermeldung von ffmpeg angezeigt:
[h264 @ 0x1012600]sps_id out of range
[h264 @ 0x1012600]non-existing SPS 0 referenced in buffering period
[h264 @ 0x1012600]sps_id out of range
[h264 @ 0x1012600]non-existing SPS 0 referenced in buffering period
[NULL @ 0x101d600]error, non monotone timestamps 13779431 >= 13779431kbits/s
av_interleaved_write_frame(): Error while opening file
Dies geschieht ungefähr in der Mitte der Codierung, was mich denken lässt, dass Sie nicht zwei .ts-Dateien zusammenfassen können, damit es funktioniert.
ffmpeg -safe 0 -f concat -i <(find . -type f -name '*' -printf "file '$PWD/%p'\n" | sort) -c copy output.mkv
(mkv akzeptiert mehr Codecs als mp4, aber Sie können es auch mit mp4 versuchen). Das-safe 0
ist für die letzten ffmpeg Versionen über beschweren Unsichere Dateinamen und das-type f
ist nur für Dateien auflistet. Ich habe hinzugefügt| sort
, um die Dateien alphabetisch zu sortieren. weilfind
liest sie in der Reihenfolge wie im Dateisystem gespeichert. Funktioniert auch für Dateien mit Leerzeichen.ffmpeg -i "concat:input1|input2" -codec copy output
. Es ist nicht erforderlich, dem Pipe-Zeichen zu entkommen.FÜR MP4-DATEIEN
Für MP4- Dateien (die ich von DailyMotion.com erhalten habe: eine 50-minütige TV-Episode, die nur in drei Teilen als drei MP4-Videodateien heruntergeladen werden kann) war das Folgende eine effektive Lösung für Windows 7 und beinhaltet KEINE Neucodierung der Dateien.
Ich habe die Dateien (als file1.mp4 , file2.mp4 , file3.mp4 ) so umbenannt, dass die Teile in der richtigen Reihenfolge für die Anzeige der gesamten TV-Episode waren.
Dann habe ich eine einfache Batch-Datei (concat.bat) mit folgendem Inhalt erstellt:
Die Batch-Datei und ffmpeg.exe müssen sich beide im selben Ordner wie die zu verbindenden MP4-Dateien befinden. Führen Sie dann die Batchdatei aus. Die Ausführung dauert normalerweise weniger als zehn Sekunden.
.
Nachtrag (21.10.2018) -
Wenn Sie nach einer Methode gesucht haben, mit der Sie alle mp4-Dateien im aktuellen Ordner ohne viel erneutes Eingeben angeben können, versuchen Sie dies stattdessen in Ihrer Windows- Batchdatei ( MUSS die Option -safe 0 enthalten ):
Dies funktioniert unter Windows 7 in einer Batchdatei. Versuchen Sie nicht , es in der Befehlszeile zu verwenden, da es nur in einer Batch-Datei funktioniert!
quelle
C:\blah>type mylist.txt<ENTER>
sie den Inhalt dieser Datei sehen). Dannffmpeg -f concat -i mylist.txt -c copy output.mp4<ENTER>
sollten Sie auch eine Referenz trac.ffmpeg.org/wiki/Concatenate einfügen (diese Referenz verwendet sogar denselben Dateinamen, mylist.txt)-i
Parameter eingeben müssen . Unter Linux habe ich Folgendes getan: Dasls -1 P1041*.mp4 | sed s/"P"/" file P"/g > mylist.txt
ist sogar noch cooler als das Codieren eines Batch-Skripts. Wie auch immer, arbeitet-c copy
sehr schnell (was mir nicht bewusst war) und das ist die wahre Magie dieser Antwort.Hier ist eine schnelle (dauert weniger als 1 Minute) und verlustfreie Möglichkeit, dies zu tun, ohne Zwischendateien zu benötigen:
Das "ls" enthält die Dateien, die verbunden werden sollen. Das "Perl" erstellt die Verkettungsdatei im laufenden Betrieb in einer Pipe. Der Teil "-i -" weist ffmpeg an, aus der Pipe zu lesen
(Hinweis: Meine Dateien enthielten keine Leerzeichen oder seltsamen Elemente. Wenn Sie diese Idee mit "harten" Dateien ausführen möchten, benötigen Sie eine entsprechende Shell-Escape-Funktion.)
quelle
ls Movie_Part_1.mp4 Movie_Part_2.mp4 | perl -ne '$_ =~ s/\n$//; print "file '"'"'$_'"'"'\n"' | ffmpeg -f concat -i - -c copy Movie_Joined.mp4
ls * | perl -ne 'print "file $_"' | ffmpeg -f concat -i - -c copy Movie_Joined.mp4
wenn Ihre Dateien gut benannt und in Ordnung sind. Hat unter OS X hervorragend funktioniert, genau das, was ich wollte.ffmpeg -safe 0 -f concat -i <(find . -type f -name '*' -printf "file '$PWD/%p'\n" | sort) -c copy output.mkv
(mkv akzeptiert mehr Codecs als mp4, aber Sie können es auch mit mp4 versuchen). Das-safe 0
ist für die letzten ffmpeg Versionen über beschweren Unsichere Dateinamen und das-type f
ist nur für Dateien auflistet. Ich habe hinzugefügt| sort
, um die Dateien alphabetisch zu sortieren. weilfind
liest sie in der Reihenfolge wie im Dateisystem gespeichert. Funktioniert auch für Dateien mit Leerzeichen.ffmpeg
, damit es funktioniert:-protocol_whitelist file,tcp,http,pipe
für MP4-Dateien:
Wenn es sich nicht genau um MP4-Dateien handelt (100% gleicher Codec, gleiche Auflösung, gleicher Typ), müssen Sie sie zunächst in Zwischen-Streams umcodieren:
HINWEIS! : Die Ausgabe erfolgt wie die erste Datei (und nicht wie eine zweite).
quelle
Ich habe versucht, drei
.mp3
Audiodateien zu einer.m4a
Datei zu verketten, und dieser Befehl ffmpeg funktioniert.Eingabebefehl:
Bedeutungen von: "-filter_complex concat = n = 3: v = 0: a = 1" :
Für weitere Informationen: Verwenden Sie
ffmpeg -h full
alle Optionen drucken (einschließlich aller format- und codecspezifischen Optionen, sehr lang).quelle
-f concat -safe 0 -i "file.txt" -c copy -y "OutPut.mp4"
Wenn Sie dies verwenden , wird es konkatieren, aber wenn einige Videos mit Audio und andere ohne Audio sind, funktioniert es nicht. Wie kann ich das klären? Danke -Am Ende habe ich mpg als Zwischenformat verwendet und es hat funktioniert (HINWEIS: Dies ist ein gefährliches Beispiel, -qscale 0 wird das Video neu codieren ...)
quelle
-sameq
wurde entfernt. Verwenden Sie-qscale 0
stattdessen.-sameq
bedeutet nicht "gleiche Qualität" und wurde aus ffmpeg entfernt, wie von @XavierHo erwähnt.concat
Befehl in ffmpeg zu verwenden, wie es @rogerdpack oben tut.Eine ausführliche Dokumentation zu verschiedenen Arten der Verkettung in ffmpeg finden Sie hier .
Sie können den 'Concat-Filter' für eine schnelle Verkettung verwenden.
Es führt eine Neucodierung durch. Diese Option ist am besten geeignet, wenn die Eingänge unterschiedliche Video- / Audioformate haben.
Zum Verketten von 2 Dateien:
Zum Verketten von 3 Dateien:
Dies funktioniert sowohl für denselben als auch für mehrere Eingabedateitypen.
quelle
ouput.mp4
Video-Bitrate ist deutlich niedriger als die Video-Bitrate der EingangsvideosIch habe festgestellt, dass der Pipe-Operator bei mir nicht funktioniert hat, als Option 3 verwendet wurde, um mehrere MP4s auf einem Mac in der akzeptierten Antwort zu speichern.
Der folgende Einzeiler funktioniert auf einem Mac (High Sierra), um MP3s zu verketten, ohne dass eine zwischengeschaltete Dateierstellung erforderlich ist.
ffmpeg -f concat -safe 0 -i <(for f in ./*.mp4; do echo "file '$PWD/$f'"; done) -c copy output.mp4
quelle
Hier 2 reine Bash-Lösungen nur mit
ffmpeg
und nicht mitEinzeilige Lösung mit
ls
Funktion, die 0 oder 2+ Argumente akzeptiert
Hinweis: Ich habe einige Lösungen in diesem Thread ausprobiert und keine hat mich zufrieden gestellt
quelle
Basierend auf den Antworten von Rogerdpack und Ed999 habe ich meine .sh-Version erstellt
Es verbindet alle
*.mp4
Dateien im aktuellen Ordner injoined-out.mp4
auf Mac getestet.
Die resultierende Dateigröße ist die genaue Summe meiner 60 getesteten Dateien. Sollte kein Verlust sein. Genau das, was ich brauchte
quelle
das hat bei mir funktioniert (unter Windows)
ein Beispiel...
Python
Verwenden Sie Python-Code, um mit so vielen mp4-Dateien in einem Ordner zu arbeiten (installieren Sie Python von python.org, kopieren Sie diesen Code, fügen Sie ihn ein, speichern Sie ihn in einer Datei namens mp4.py und führen Sie ihn aus dem cmd aus, der im Ordner mit Python geöffnet ist mp4.py und alle mp4 im Ordner werden verkettet)
Version 2 mit Python
Aus meinem Beitrag in meinem Blog entnommen , mache ich das in Python so:
quelle
.mp4
Ich fand, dass es für Dateien besser und schneller funktioniert, das OpenSource-Befehlszeilentool zu verwenden :mp4box
. Dann können Sie es folgendermaßen verwenden:Laden Sie es hier für die meisten Plattformen herunter: https://gpac.wp.imt.fr/mp4box/
quelle
Hier ist ein Skript, das ich erstellt habe, um mehrere GoPro-MP4s zu einem 720p-MP4 zu verketten. Hoffe es ist hilfreich.
quelle
Aus der Dokumentation hier: https://trac.ffmpeg.org/wiki/Concatenate
Dieser Ansatz funktioniert auf allen Plattformen.
Ich brauchte die Fähigkeit, dies in einem plattformübergreifenden Skript zu kapseln, also habe ich
fluent-ffmpeg
die folgende Lösung verwendet und gefunden:quelle
quelle
Zusammenführen aller mp4-Dateien aus dem aktuellen Verzeichnis
Ich persönlich mag es nicht, externe Dateien zu erstellen, die ich später löschen muss, daher folgte meine Lösung, die eine Auflistung der Dateinummern enthält (wie
file_1_name, file_2_name, file_10_name, file_20_name, file_100_name
, ...).quelle
Nach verschiedenen Versuchen unten funktionierte das Skript für mich unter Windows 10 Powershell.
Hier erstellen die ersten beiden Zeilen eine Textdatei temp.txt mit folgendem Inhalt
Die 3. und 4. Zeile prüfen, ob ffmpeg im Pfad verfügbar ist, und erstellen die Datei "join.mp4".
Die wichtigsten Unterschiede zu anderen Antworten sind nachstehend aufgeführt
Für meine oben funktionierende MP4-Datei müssen Sie möglicherweise andere Alternativen wie die folgenden verwenden, abhängig von Ihrer Videokodierung.
Alle möglichen Bitstream-Filter finden Sie unter https://ffmpeg.org/ffmpeg-bitstream-filters.html
quelle
Hier ist meine Methode zum Verbinden eines Verzeichnisses voller MP4-Dateien mithilfe der Befehlssubstitution und des Concat-Videofilters (dieser wird neu codiert) 17 Dateien auf einen Schlag verbunden):
Hinweis: Dieser Befehl verknüpft Ihre Dateien in der Reihenfolge, in der sie benannt sind (dh in derselben Reihenfolge, in der sie beim Ausführen angezeigt werden
ls *.mp4
). In meinem Fall hatten sie jeweils eine Titelnummer, sodass es hervorragend funktioniert hat.quelle
Das hier beschriebene Concat-Protokoll; https://trac.ffmpeg.org/wiki/Concatenate#protocol
Bei Implementierung mit Named Pipes, um Zwischendateien zu vermeiden
Ist sehr schnell (lesen: sofort), hat keine Frames gelöscht und funktioniert gut.
Denken Sie daran, die genannten Pipe-Dateien zu löschen und zu überprüfen, ob es sich bei dem Video um H264 und AAC handelt, was Sie nur tun können
ffmpeg -i filename.mp4
(überprüfen Sie, ob h264 und aac erwähnt wurden).quelle
Die akzeptierte Antwort in Form eines wiederverwendbaren PowerShell-Skripts
quelle