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?
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.
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.
Pour éviter le traitement de plusieurs fichiers en même temps (ce qui peut utiliser trop de ressources), utilisez parallel
name__. 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,
limiter l'application aux vidéos contenant aac
audio.
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"
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