web-dev-qa-db-fra.com

Extraire l'audio par lots avec avconv sans transcodage

J'ai environ 70 fichiers MP4, et je veux extraire les fichiers audio directement sans transcodage supplémentaire. Tous les fichiers mp4 ont des fichiers audio aac.

Je comprends que je peux utiliser la commande suivante pour extraire le fichier audio de l’un des fichiers mp4:

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

Comment puis-je extraire tous les fichiers audio de tous les 70 fichiers mp4, de sorte que je me retrouve avec 70 fichiers aac?

13
oshirowanen

Vous pouvez utiliser une simple boucle for:

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

ou sur une ligne:

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

Ce qui est fait, c'est exécuter avconv une fois pour chaque fichier nommé *.mp4 où le nom du fichier est stocké dans la variable ${i}.

${i%.mp4} signifie ${i} (c.-à-d. le nom du fichier) avec .mp4 enlevé de la fin.

20
Andrew Gunnerson

La réponse de Xiao est généralement la plus utile si vous avez tous les fichiers dans un seul répertoire; mais si des fichiers MP4 sont dispersés dans différents répertoires, vous pouvez utiliser cette commande find pour les convertir tous.

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

Ceci utilise une forme légèrement différente de substitution de chaîne bash à la fin: "$ {0 /% mp4/m4a}" indique à bash de remplacer mp4 par m4a, mais uniquement si mp4 se trouve à la fin de la chaîne.

5
evilsoup

Pour éviter le traitement de plusieurs fichiers en même temps (ce qui peut utiliser trop de ressources), utilisez parallelname__. Par défaut, il ne fait qu'un travail à la fois. Si vous souhaitez utiliser plusieurs cœurs de processeur en parallèle, essayez parallel -j 4 ... pour 4 tâches en parallèle. Consultez également man parallel.

Sudo apt-get install parallel

Cette ligne extrait les fichiers audio aacà partir des vidéos sélectionnées et les place dans des conteneurs m4a.

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

Lorsque vous travaillez directement dans la CLI, remplacez%F par la liste de vos fichiers d'entrée. Par exemple. *.mp4.

Inspiré par this répondre, par ne réponse précédente à cette question, et par le commentaire de evilsoup à cette dernière (en disant: 'Les fichiers aac bruts ne peuvent pas contenir de métadonnées. Si vous souhaitez conserver les métadonnées des fichiers d'origine, utilisez m4a (qui est juste un autre nom pour mp4, mais qui est assez largement reconnu par les lecteurs audio) au lieu de aac. une extension de fichier ').

J'utilise de telles commandes dans les actions personnalisées Thunar,

enter image description here

limiter l'application aux vidéos contenant aacaudio.

enter image description here

Pour avoir une fenêtre de terminal ouverte pendant le traitement, qui se ferme à la fin, la commande peut être modifiée comme suit:

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

J'ai étendu la réponse de @ Xiao-Long Chen en le transformant en un script qui ignore les fichiers lorsque le fichier de sortie est plus récent:

#!/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
2
dr. Sybren