Ich möchte Videos in einer Stapelgröße von jeweils zwanzig (20) zusammenführen. Ich verwende eine Linux-Maschine. Die Videos sind im mp4-Format und mäßiger Qualität. Bei einigen fehlt sogar der Audiostream. Bisher habe ich versucht ffmpeg
, mencoder
, cvlc/vlc
und MP4Box
. Ich möchte ein Befehlszeilenskript schreiben, um dies zu erreichen, da ich die Stapelverarbeitung durchführe.
Das Hauptproblem ist, dass einige der Lösungen, die ich ausprobiert habe, für zwei Videos gut funktionieren, einige für Videos mit Audiostream und wieder andere für eine andere Teilmenge meines Videosets. Für diese Aufgabe konnte ich jedoch keine umfassende Lösung finden.
ffmpeg
, einschließlich Filter und Dateiprotokolle . Ich habe auch versucht, dieconcat
Funktion von zu verwendencvlc/vlc
. Ich habe auch dieconcat
Funktion von ausprobiertmencoder
. All dies funktionierte teilweise. Dies half mir schließlich, die Angelegenheit zu lösen.melt {input-sequence} -consumer avformat:{output-name} acodec=libmp3lame vcodec=libx264
Antworten:
Ich verwende
mkvmerge
, um mehrere MP4-Dateien zu einer einzigen zu verbinden:quelle
.mkv
für die Ausgabedatei zu verwenden, da es sich um einen Matroska-Container handelt, unabhängig davon, welche Erweiterung Sie angeben.mkvmerge
: tipsonubuntu.comSie können es tun mit
ffmpeg
:Referenz und weitere Infos
quelle
Dies löste die Angelegenheit: https://stackoverflow.com/a/22324018/5014767
melt
ist ein großartiges Kommandozeilen-Dienstprogramm. Hier ist die SeiteBearbeiten von Kommentaren: Der Befehl, der mein Problem löste, war dieser
melt {input-sequence} -consumer avformat:{output-name} acodec=libmp3lame vcodec=libx264
quelle
Ich habe ein kleines Shell-Skript geschrieben, um MP4-Dateien ohne Umcodierung mit ffmpeg zu komprimieren.
Dadurch werden Zwischendateien in einem MPEG-Container erstellt und dann zu einem MP4 verkettet.
quelle
for f in *.MP4
ohne zu verwendenls
. (Die Verwendungls
in Skripten sollte aus mehreren wichtigen Gründen vermieden werden. Es gibt bessere Optionen.) Verwenden Sie auch Anführungszeichen für Variablen, es sei denn, Sie sind sicher, dass keine Leerzeichen oder andere Sonderzeichen vorhanden sind, also"${f}"
(oder nur"$f"
) anstelle von Anführungszeichen$f
.CONCAT=$(echo $(ls *.ts) | sed -e "s/ /|/g")
funktioniert nicht gut mit Dateinamen, die 1, 2, 3 ... 10 ... 20 sind. Sie werden dann als 1, 10 ... 2, 20 ... usw. analysiert. Ich schlage vor, dassCONCAT=$(echo $(ls -v *.ts) | sed -e "s/ /|/g")
dies die Reihenfolge sicherstellt .Erstellen Sie eine Datei files.txt mit allen Dateien, die Sie verketten möchten, in der folgenden Form (Zeilen, die mit einem # beginnen, werden ignoriert):
Beachten Sie, dass dies entweder relative oder absolute Pfade sein können. Dann können Sie Ihre Dateien streamen, kopieren oder neu codieren:
quelle
Mein Drehbuch, rein in
bash
undffmpeg
. Kodiert in einer Befehlszeile angegebene Dateien neu in eine.Erfordert, dass die Dateien dieselbe Auflösung haben. Akzeptiert verschiedene Metadatenrotationen, was
ffmpeg concat:
nicht der Fall ist.quelle
Ich habe ein Python-Skript erstellt , das mit moviepy auch Untersegmente verketten kann (nützlich, wenn Sie beispielsweise einige Teile aus einem Video entfernen möchten).
Verwenden Sie es mit:
quelle
Zusätzlich zu Maythuxs Antwort von :
Dh die zu verkettenden Videos verwenden einen der oben genannten Videocontainer (zu denen ich aus persönlichen Gründen MPEG-4 Part 14 hinzufüge). Sie können einfach:
quelle