Kürzere Befehle

Kürzere Befehle

Ich verwende Arch Linux 4.13.10 und möchte mehrere .MOVmit einer Canon EOS-Kamera aufgenommene Dateien kombinieren.

Ich habe versucht, die Dateien mit FFmpeg in Transportströme ( .tsDateien) 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 .mp4Konvertierung 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 .MOVDatei 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 0um 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 .movDateien .MOVzu 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 -1angezeigt wird, dass Sie diese Dateien haben:

    REC_0009.MOV
    REC_0010.MOV
    REC_0011.MOV
    

    findDer Befehl erstellt dann diese files.txtDatei:

    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 .movoder enden .MOV, oder eine beliebige andere Kombination aus Großbuchstaben.

  • Wenn Sie -safe 0den ffmpegBefehl 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 0Option weist darauf hin ffmpeg, diesen Fehler zu ignorieren und „unsichere“ Verzeichnisse in Dateipfaden zu akzeptieren.

    @Matthias Braun erwähnt das hier.

    Aus der ffmpegManpagenur online(nichtin der man ffmpegManpage 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.

    -1entspricht 1der automatischen Formatprüfung und 0andernfalls.

  • Die -c copyOption weist darauf hin ffmpeg, den Codec „Kopie“ zu verwenden, was bedeutet, dass das Video nicht neu kodiert wird. Das macht es so schnell.

Verweise

  1. Ich studierte@Matthias Brauns Antwort auch.
  2. Meine Antwort hier ist, was ich \x27zur Charaktererstellung verwende ':Stack Overflow: So umgehen Sie einfache Anführungszeichen innerhalb von Zeichenfolgen in einfachen Anführungszeichen
  3. Ich habe viel mit der GitHub Copilot AI in meinem VSCode-Texteditor gesprochen, während ich die Nuancen der obigen Befehle herausgefunden habe.
  4. Meine Antwort für MP4-Dateien:Stack Overflow: Wie verkette ich zwei MP4-Dateien mit FFmpeg?

verwandte Informationen