Batch-Extraktion von Audio mit avconv ohne Transcodierung


14

Ich habe ungefähr 70 mp4-Dateien und möchte die Audiodateien direkt extrahieren, ohne sie weiter zu transkodieren. Alle mp4-Dateien haben AAC-Audiodateien.

Ich verstehe, dass ich den folgenden Befehl verwenden kann, um die Audiodatei aus einer der mp4-Dateien zu extrahieren:

avconv -i "INPUT FILE" -map 0:1 -c:a copy "OUTPUT FILE"

Wie extrahiere ich alle Audiodateien aus allen 70 MP4-Dateien, sodass ich am Ende 70 AAC-Dateien habe?

Antworten:


21

Sie können eine einfache for-Schleife verwenden:

for i in *.mp4; do
    avconv -i "${i}" -map 0:1 -c:a copy "${i%.mp4}.aac"
done

oder in einer Zeile:

for i in *.mp4; do avconv -i "${i}" -map 0:1 -c:a copy "${i%.mp4}.aac"; done

Was getan wird, wird avconveinmal für jede Datei mit dem Namen ausgeführt, *.mp4in der der Dateiname in der ${i}Variablen gespeichert ist.

${i%.mp4}bedeutet ${i}(dh der Dateiname) mit .mp4vom Ende abgestreift.


2
IIRC, RAW-AAC-Dateien dürfen keine Metadaten enthalten. Wenn Sie Metadaten aus den Originaldateien behalten möchten, verwenden Sie m4a (was nur ein anderer Name für mp4 ist, aber von Audioplayern weithin erkannt wird) anstelle von aac als Dateierweiterung.
Übelsuppe

Wofür ist die Option -map? Warum wählen Sie den 0: 1-Stream anstelle anderer Streams wie 0: 0, 0: 2?
Qed

Ich ließ die -map Option und es funktioniert gut
qed

bash /path/to/the/script %F

2
@qed: Das Löschen -mapkann dazu führen, dass das Video weiterhin betrachtet wird, wenn Sie in ein anderes Ausgabeformat wechseln (wenn dieses Format sowohl Audio als auch Video enthalten kann). Es ist sicherer, es so zu halten, wie es ist.
dr. Sybren

5

Die Antwort von Xiao ist im Allgemeinen am nützlichsten, wenn Sie alle Dateien in einem Verzeichnis haben. Wenn sich jedoch MP4-Dateien in verschiedenen Verzeichnissen befinden, können Sie sie mit diesem findBefehl alle konvertieren.

find . -type f -name '*.mp4' -exec bash -c 'avconv -i "$0" -c:a copy "${0/%mp4/m4a}"' {} \;

Dabei wird eine etwas andere Form der Bash-Zeichenfolgensubstitution am Ende verwendet: "$ {0 /% mp4 / m4a}" weist bash an, mp4 durch m4a zu ersetzen, jedoch nur, wenn sich mp4 am Ende der Zeichenfolge befindet.


Ich wusste nie, dass diese Bash diese Art der Substitution hatte.
Super

1
@xiao Wenn Sie das weglassen, wird die %erste Instanz der gefundenen Zeichenfolge ersetzt. Sie können auch festlegen #, dass die Zeichenfolge nur ersetzt wird, wenn sie am Anfang einer Variablen steht. also würde $ {0 / mp4 / m4a} die erste Instanz von mp4 durch m4a ersetzen (was ein Problem sein könnte, wenn Sie wirklich seltsame Dateinamen haben); und $ {0 / # mp4 / m4a} ersetzt m4a durch mp4, jedoch nur dann, wenn der Zeichenfolgenwert der Variablen mit mp4 beginnt (hier wird er offensichtlich nicht verwendet, kann aber an anderer Stelle nützlich sein).
Übelsuppe

3

Um zu vermeiden, dass mehrere Dateien gleichzeitig verarbeitet werden (was möglicherweise zu viele Ressourcen beansprucht), verwenden Sie parallel. Standardmäßig wird jeweils nur ein Job ausgeführt. Wenn Sie mehrere CPU-Kerne gleichzeitig verwenden möchten, versuchen Sie, parallel -j 4 ...4 Jobs gleichzeitig auszuführen. Schau auch mal rein man parallel.

sudo apt-get install parallel

Diese Zeile extrahiert aacAudiodateien aus ausgewählten Videos und legt sie in m4aContainern ab.

parallel avconv -i '{}' -map 0:1 -c:a copy '{.}.m4a' ::: %F

Wenn Sie direkt in der CLI arbeiten, ersetzen Sie diese %Fdurch die Liste Ihrer Eingabedateien. Eg *.mp4.

Inspiriert von dieser Antwort, von einer früheren Antwort auf diese Frage und von Evilsoups Kommentar zu dieser Frage (mit den Worten: " RAW - AAC - Dateien dürfen keine Metadaten enthalten. Wenn Sie Metadaten aus den Originaldateien behalten möchten, verwenden Sie m4a (which ist nur ein anderer Name für mp4, wird aber von Audioplayern (anstelle von aac als Dateierweiterung ) ziemlich häufig erkannt .

Ich benutze solche Befehle in Thunar benutzerdefinierten Aktionen,

Bildbeschreibung hier eingeben

Beschränkung der Anwendung auf Videos, die aacAudio enthalten .

Bildbeschreibung hier eingeben

Um während der Verarbeitung ein Terminalfenster zu öffnen, das am Ende geschlossen wird, kann der Befehl wie folgt geändert werden:

 gnome-terminal -e "parallel avconv -i '{}' -map 0:1 -c:a copy '{.}.m4a' ::: %F"

2

Ich habe die Antwort von @ Xiao-Long Chen erweitert und in ein Skript umgewandelt, das Dateien überspringt, wenn die Ausgabedatei neuer ist:

#!/bin/bash

for file in *.mp4; do
    OUT="${file/.mp4/.m4a}"

    if [ "$file" == "$OUT" ]; then
        echo "Unable to handle $file" >&2
        exit 1
    fi

    if [ "$OUT" -nt "$file" ]; then
        echo "Skipping $file; output file is newer."
        continue
    fi

    echo "Converting \"$file\" -> \"$OUT\""
    avconv -loglevel warning -i "$file" -map 0:1 -c:a copy "$OUT"
done
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.