J'ai essayé différentes options sur les forums, mais la plupart d'entre elles sont obsolètes (ffmpeg m'en parle, comme avec l'option -sameq). J'essaie de comprendre la documentation, mais je ne peux pas.
Je veux savoir comment convertir récursivement avec ffmpeg de wma en mp3 avec par exemple un débit maximum de 192 kbps en sortie (mais pas 192 ceci si l'original était de 128 kbps)
J'ai moins que 14K fichiers WMA répartis dans de nombreux répertoires. Donc, je ne veux pas les déplacer. Convertissez-les simplement en conservant le nom du fichier et les métadonnées et supprimez-les, s'il est possible de lire la liste des fichiers à convertir à partir d'un fichier txt que je peux créer, un fichier par ligne. Avec cela, j'arriverais à faire la recherche récursive, une pâte dedans.
Merci pour toute aide. Et encore plus merci pour toute explication sur Ffmpeg.
Caroxo
PS: Soundconverter était bon, mais lent. Maintenant ni l'un ni l'autre. Ne fonctionne pas dans 14.04 dans de nombreux cas, comme le mien. J'utilise Soundkonverter mais c'est très lent. Donc, tout cela pour empêcher ces recommandations. Et je veux apprendre à utiliser ce puissant ffmpeg! et la CLI
REMARQUE: le script ci-dessous fonctionnait lors des premières conversions. Mais pour une raison que je ne peux pas expliquer, j'ai soudainement supprimé les wma en cours de conversion, sans quitter le mp3. Alors, j'ai encore changé pour "non résolu" (pour éviter de temps en temps le problème à quelqu'un d'autre). Le problème semble venir de avconv "Application fournie invalide, augmentant de manière non monotone dts à muxer dans le flux 0: 23606> = 21720" (il y a des pâtes binaires dans les commentaires si quelqu'un est intéressé à développer ce bogue). Donc, pas d'avconv dans le futur.
C’est la commande que j’utilise pour ffmpeg tous les fichiers du répertoire actuel (fonctionne si les noms contiennent des espaces) sur Mac où brew n’a pas avconv:
for file in *.wma; do ffmpeg -i "${file}" -acodec libmp3lame -ab 192k "${file/.wma/.mp3}"; done
Dans un terminal, accédez d'abord au dossier contenant toute votre musique en utilisant cd
, par exemple:
cd /home/username/music/wma-to-convert
Ce qui suit va faire une liste de tous les fichiers du dossier actuel et de tous les sous-dossiers se terminant par "wma" et la stocker dans un document texte appelé wma-files.txt
:
find . -type f | grep wma$ > wma-files.txt
Ou vous pouvez créer le fichier texte manuellement si vous le souhaitez. Saisissez ensuite le texte suivant dans un éditeur de texte et enregistrez-le dans le même répertoire que wma-files.txt
, en le nommant par exemple conv-script
:
#!/usr/bin/env bash
readarray -t files < wma-files.txt
for file in "${files[@]}"; do
out=${file%.wma}.mp3
probe=`avprobe -show_streams "$file" 2>/dev/null`
rate=`echo "$probe" | grep "^bit_rate" | sed "s:.*=\(.*\)[0-9][0-9][0-9][.].*:\1:" | head -1`
ffmpeg -i "$file" -ab "$rate"k "$out"
done
Vous devez probablement définir le bit exécutable sur le script:
chmod +x conv-script
Ensuite, lancez-le:
./conv-script
Vous avez également la possibilité d'ajouter ceci à la fin de la ligne ffmpeg
, mais soyez prudent:
&& rm "$file"
Pour ceux qui n’ont pas accès à avprobe, vous pouvez utiliser ffprobe qui fait l’équivalent (c’est-à-dire obtenir le bit_rate). Pour faire ça:
Remplacer:
probe=`avprobe -show_streams "$file" 2>/dev/null`
rate=`echo "$probe" | grep "^bit_rate" | sed "s:bit_rate=\([0-9]\+\)[0-9]\{3\}:\1:" | head -1`
avec:
rate=`ffprobe -v error -show_entries format=bit_rate -of default=noprint_wrappers=1:nokey=1 "$file"`
Une fois que cela est fait, tous vos fichiers devraient commencer à convertir et les originaux wma devraient être supprimés! Cela a très bien fonctionné pour moi en convertissant des fichiers flac en mp3. Malheureusement, je n'ai aucun test à effectuer, mais je m'attends à ce que tout se passe bien.
REMARQUE: Bien que je ne prévois aucun problème, il serait judicieux de copier quelques fichiers dans un nouveau répertoire et de les tester.
Si vous envisagez de convertir souvent Wma en mp3, le script ci-dessous convertit et supprime automatiquement tout ce qui se trouve dans le dossier sous forme d'argument. Cela améliore un peu ce qui est mentionné ci-dessus. De plus, la commande ffmpeg est un peu différente de la première proposée, si la première ne fonctionne pas, utilisez celle ci-dessous.
#!/usr/bin/env bash
cd "$1"
find . type f | grep wma$ > wma-files.txt
readarray -t files < wma-files.txt
for file in "${files[@]}"; do
out=${file%.wma}.mp3
ffmpeg -i "$file" -map_metadata 0:s:0 $out"
done
rm wma-files.txt
Ensuite, vous appelez simplement cela en tapant votre terminal comme suit:
./convScript /home/username/music
Ainsi, tous les dossiers de musique et leurs sous-dossiers verront sa musique wma automatiquement convertie en mp3.
Comme auparavant, vous pouvez ajouter ceci à la fin de la ligne ffmpeg
pour la suppression du fichier:
&& rm "$file"
EDIT (2017/06/23): ne faites pas rm
la valeur par défaut
Pour toute version
J'ai trouvé un moyen pratique de faire cela avec mplayer. Ce script renomme les fichiers pour supprimer tous les espaces vides dans les noms des fichiers et convertit de manière récursive tous les fichiers .wma du répertoire en cours en .mp3:
#!/bin/bash
for f in *.wma; do
newname=`echo $f | tr ' ' '_' `
mv "$f" $newname
f=$newname
mplayer $f -novideo -ao pcm:file=tmp.wav
lame -V 0 -q 0 tmp.wav ${f/.wma/.mp3}
rm -f tmp.wav
done
Voici une version à une doublure:
for f in *.wma; do; newname=`echo $f | tr ' ' '_' `; mv "$f" $newname; f=$newname; mplayer $f -novideo -ao pcm:file=tmp.wav; lame -V 0 -q 0 tmp.wav ${f/.wma/.mp3}; rm -f tmp.wav; done
Je réécris le script TheSchwa (merci TheSchwa!), Avec les modifications suivantes:
rm
(les convertisseurs ne suppriment généralement pas les fichiers, cela peut être une grosse surprise!).#!/bin/bash
which ffmpeg > /dev/null || { echo "Install ffmpeg, with 'Sudo apt-get install ffmpeg'" >&2; exit 1; }
which avprobe > /dev/null || { echo "Install libav-tools, with 'Sudo apt-get install libav-tools'" >&2; exit 1; }
output_format=mp3
file=`mktemp`
find . -type f | grep -i wma$ > $file
readarray -t files < $file
for file in "${files[@]}"; do
out=${file%.wma}.$output_format
probe=`avprobe -show_streams "$file" 2>/dev/null`
rate=`echo "$probe" | grep "^bit_rate" | sed "s:bit_rate=\([0-9]\+\)[0-9]\{3\}:\1:" | head -1`
ffmpeg -i "$file" -ab "$rate"k "$out"
done
Ceci est un script bash, utilisant parallel :
#!/bin/bash
parallel -i -j$(nproc) ffmpeg -i {} -acodec libmp3lame -ab 192k {}.mp3 ::: ./*.wma
rename 's/.wma//' *.wma.mp3
Remarque: ce qui suit ne s'applique pas aux 15.04, 15.10 et 16.04
Premier:
ffmpeg est déconseillé dans 14.04 de toute façon et vous devriez maintenant utiliser avconv
à la place.
Sudo apt-get install avconv
Utilisez cette commande pour convertir les fichiers wma en mp3 de manière récursive:
for i in `find . -type f -name '*.wma'`; do avconv -i "$i" "${i/.wma/.mp3}"; done
Ensuite, une fois que vous avez vérifié la qualité des fichiers, vous pouvez exécuter cette commande pour supprimer ou supprimer les versions .wma d'origine de manière récursive:
for i in `find . -type f -name '*.wma'`; do rm "$i"; done
Prochain:
Voici comment utiliser la commande dans un script à la place (nommé "wma2mp3":
Sudo nano /usr/local/bin/wma2mp3
copier et coller ceci dans le fichier:
#!/bin/bash
for i in `find . -type f -name '*.wma'`; do avconv -i "$i" "${i/.wma/.mp3}"; done
Presse ctrl + o puis appuyez sur enter pour sauvegarder le fichier et utiliser ctrl + x pour quitter.
Ensuite, rendez le fichier exécutable avec la commande suivante:
Sudo chmod +x /usr/local/bin/wma2mp3
Maintenant, vous pouvez simplement exécuter la commande wma2mp3
pour convertir récursivement tous les fichiers wma en mp3.
Faites juste la même chose avec le script pour effacer tous les fichiers wma et nommez-le comme vous voulez.
En passant, si vous voulez seulement convertir tous les fichiers du répertoire en cours uniquement (pas dans tous les autres répertoires récursifs suivants), vous pouvez utiliser cette commande à la place:
for i in *.wma; do avconv -i "$i" "${i/.wma/.mp3}"; done
et bien sûr, pour supprimer les fichiers wma du répertoire en cours uniquement, utilisez cette commande:
rm *.wma