
Ich verwende Arch Linux 4.13.10 und möchte mehrere .MOV
mit einer Canon EOS-Kamera aufgenommene Dateien kombinieren.
Ich habe versucht, die Dateien mit FFmpeg in Transportströme ( .ts
Dateien) umzuwandeln, wie gezeigtHier, aber in der resultierenden Datei fehlte der Ton.
Mir wäre es lieber, wenn die resultierende Datei wäre .mp4
, aber das ist nicht unbedingt erforderlich.
Wie mache ich das?
Antwort1
Ich habe die Dateien erfolgreich zusammengeführt mitFFmpegs Demuxing-Funktion. Zur .mp4
Konvertierung musste ich den Audiostream explizit konvertieren, um diesen Fehler zu vermeiden:
Tag für Codec pcm_s16le konnte in Stream Nr. 1 nicht gefunden werden, Codec wird derzeit im Container nicht unterstützt
Dies ist der Befehl, der die Dateien wie folgt kombiniert merged.mp4
:
ffmpeg -f concat -i files_to_combine.txt -vcodec copy -acodec aac -strict -2 -b:a 384k merged.mp4
Wenn die Ausgabedatei auch eine .MOV
Datei sein kann, lautet der Befehl:
ffmpeg -f concat -i files_to_combine.txt -vcodec copy -acodec copy merged.MOV
Hier ist der Inhalt der Textdatei files_to_combine.txt
:
file ./first_file.MOV
file ./second_file.MOV
Wenn Sie die Fehlermeldung
Unsicherer Dateiname 'Datei mit Leerzeichen.mov' files_to_combine.txt: Vorgang nicht zulässig
und den Dateinamen vertrauen, können Sie hinzufügen, -safe 0
um diesen Fehler zu umgehen. Siehe FFmpegsmanpage:
ffmpeg -safe 0 -f concat ...
Kürzere Befehle
Als ich die gleiche Aufgabe fünf Jahre später versuchte, hatte ich ebenfalls Erfolg mit
ffmpeg -f concat -i files_to_combine.txt merged.mov
Und
ffmpeg -f concat -i files_to_combine.txt -f mp4 merged.mp4
Antwort2
find *.MOV | sed 's:\ :\\\ :g'| sed 's/^/file /' > fl.txt; ffmpeg -f concat -i fl.txt -c copy output.mp4; rm fl.txt
Antwort3
Wenn Sie stattdessen nach einer Möglichkeit zum Verketten von Dateien suchen .mp4
, lesen Sie hier meine andere Antwort:Stack Overflow: Wie verkette ich zwei MP4-Dateien mit FFmpeg?
So kombinieren Sie mehrere .mov
Dateien .MOV
zu einer
...das müssen Sie tun:
# 0. Copy all .mov files that (you'd like to combine) into a single directory.
# Then `cd` into that directory.
# 1. Create a "files.txt" file containing a list of files to combine
find . -type f -iname "*.mov" | sort -V \
| awk '{print "file \x27" $0 "\x27"}' > files.txt
# [WHAT I USUALLY USE: FAST]
# 2. **If all of your .mov files have the same encoding** (ex: they were
# all recorded on the same video camera and with the same settings), you can
# specify to use the "copy" codec via `-c copy`, which means it will NOT
# have to re-encode the video. This just concatenates all the files together.
# THIS TAKES **SECONDS**.
time ffmpeg -f concat -safe 0 -i files.txt -c copy merged.mov
# [SLOW; SOMETIMES NECESSARY]
# OR 2. **If each of your .mov files has a different encoding,** you'll need to
# re-encode them all into a single stream.
# - This uses the "files.txt" file created above, and outputs the merged
# file into "merged.mov".
# THIS COULD TAKE **HOURS**.
time ffmpeg -f concat -safe 0 -i files.txt merged.mov
Ich bin im Allgemeinen in einer Situation, in der ich die erste Option verwenden kann, dieSekundenanstattStd., was großartig ist!
Weitere Details und Erklärung
Wenn
ls -1
angezeigt wird, dass Sie diese Dateien haben:REC_0009.MOV REC_0010.MOV REC_0011.MOV
find
Der Befehl erstellt dann diesefiles.txt
Datei:file './REC_0009.MOV' file './REC_0010.MOV' file './REC_0011.MOV'
Das
-iname "*.mov"
Teil macht einen Fall-Insenstive*-Übereinstimmung für alle Dateien, die mit.mov
oder enden.MOV
, oder eine beliebige andere Kombination aus Großbuchstaben.Wenn Sie
-safe 0
denffmpeg
Befehl vergessen und einer Ihrer Dateinamen ein „Verzeichnis“ in der Form „./
even“ enthält, erhalten Sie eine Fehlermeldung wie die folgende:[concat @ 0x555a24968700] Unsafe file name './REC_0009.MOV' files.txt: Operation not permitted
Die
-safe 0
Option weist darauf hinffmpeg
, diesen Fehler zu ignorieren und „unsichere“ Verzeichnisse in Dateipfaden zu akzeptieren.@Matthias Braun erwähnt das hier.
Aus der
ffmpeg
Manpagenur online(nichtin derman ffmpeg
Manpage lokal auf meinem Linux Ubuntu 20.04-Computer):https://manpages.org/ffmpeg:safe
Wenn auf gesetzt
1
, werden unsichere Dateipfade abgelehnt. Ein Dateipfad gilt als sicher, wenn er keine Protokollspezifikation enthält und relativ ist und alle Komponenten nur Zeichen aus dem portablen Zeichensatz (Buchstaben, Ziffern, Punkt, Unterstrich und Bindestrich) enthalten und am Anfang einer Komponente kein Punkt steht.Wenn auf gesetzt
0
, wird jeder beliebige Dateiname akzeptiert.Der Standardwert ist
1
.-1
entspricht1
der automatischen Formatprüfung und0
andernfalls.Die
-c copy
Option weist darauf hinffmpeg
, den Codec „Kopie“ zu verwenden, was bedeutet, dass das Video nicht neu kodiert wird. Das macht es so schnell.
Verweise
- Ich studierte@Matthias Brauns Antwort auch.
- Meine Antwort hier ist, was ich
\x27
zur Charaktererstellung verwende'
:Stack Overflow: So umgehen Sie einfache Anführungszeichen innerhalb von Zeichenfolgen in einfachen Anführungszeichen - Ich habe viel mit der GitHub Copilot AI in meinem VSCode-Texteditor gesprochen, während ich die Nuancen der obigen Befehle herausgefunden habe.
- Meine Antwort für MP4-Dateien:Stack Overflow: Wie verkette ich zwei MP4-Dateien mit FFmpeg?