Extrait audio par lots avec avconv sans transcodage

14

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 fichiers 70 mp4, donc je me retrouve avec 70 fichiers aac?

oshirowanen
la source

Réponses:

21

Vous pouvez utiliser une boucle for simple:

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

ou sur une seule ligne:

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

Ce qui est exécuté avconv une fois pour chaque fichier nommé comme *.mp4où le nom de fichier est stocké dans la ${i}variable.

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

Andrew Gunnerson
la source
2
IIRC, 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 comme extension de fichier.
evilsoup
À quoi sert l'option -map? Pourquoi choisissez-vous le flux 0: 1 plutôt que d'autres flux, tels que 0: 0, 0: 2?
qed
J'ai abandonné l'option -map et cela fonctionne très bien
qed
pour utiliser cette commande dans les actions personnalisées Thunar et similaires, cela fonctionne si elle est ajoutée à un script et dans les actions Thunar: bash /path/to/the/script %F- comme ici
2
@qed: la suppression -mappeut toujours faire en sorte que la vidéo soit considérée lorsque vous passez à un autre format de sortie (si ce format peut contenir à la fois de l'audio et de la vidéo). Il est plus sûr de le garder tel quel.
dr. Sybren
5

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

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

Cela 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 seulement si le mp4 est à la fin de la chaîne.

evilsoup
la source
Je n'ai jamais su que bash avait ce type de substitution. Génial :)
Andrew Gunnerson
1
@xiao Si vous omettez le %, il remplacera la première instance de la chaîne qu'il trouve; vous pouvez également l'utiliser #pour ne remplacer la chaîne que si elle se trouve au début d'une variable; donc $ {0 / mp4 / m4a} remplacerait la première instance de mp4 par m4a (ce qui pourrait être un problème si vous avez des noms de fichiers vraiment étranges); et $ {0 / # mp4 / m4a} remplacera mp4 par m4a, mais seulement si la valeur de chaîne de la variable commence par mp4 (inutile ici, évidemment, mais cela pourrait être utile ailleurs).
evilsoup
3

Pour éviter le traitement simultané de plusieurs fichiers (qui pourraient utiliser trop de ressources), utilisez parallel. Par défaut, il ne fait qu'un seul travail à la fois. Si vous souhaitez utiliser plusieurs cœurs de processeur en parallèle, essayez parallel -j 4 ...4 travaux en parallèle. Consultez également man parallel.

sudo apt-get install parallel

Cette ligne va extraire aacles fichiers audio des vidéos sélectionnées et les mettre dans des m4aconteneurs.

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

Lorsque vous travaillez directement dans l'interface CLI, remplacez-le %Fpar la liste de vos fichiers d'entrée. Par exemple *.mp4.

Inspiré par cette réponse, par une réponse précédente à cette question et par le commentaire d' Evilsoup à cette dernière (en disant: `` les fichiers raw aac 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 est assez largement reconnu par les lecteurs audio) au lieu de aac comme extension de fichier ' ).

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

entrez la description de l'image ici

limiter l'application aux vidéos contenant du aacson.

entrez la description de l'image ici

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

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

J'ai étendu la réponse de @ Xiao-Long Chen, en la 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
dr. Sybren
la source