web-dev-qa-db-fra.com

Comment utiliser Ffmpeg pour convertir wma en mp3 de manière récursive, en important à partir d'un fichier txt?

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.

6
CaRoXo

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
16
Dan Rahmel

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

9
TheSchwa

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
3
mchid

Je réécris le script TheSchwa (merci TheSchwa!), Avec les modifications suivantes:

  • la détection avprobe fonctionne (au moins sur la version 2.5.2 de ffprobe à partir de la version instable actuelle de Debian).
  • Ne supprimez pas les fichiers avec rm (les convertisseurs ne suppriment généralement pas les fichiers, cela peut être une grosse surprise!).
  • Charger des fichiers wma dans un script.
  • Aide en cas de fichiers binaires manquants.
#!/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
3
pevik

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
1
Aubin

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
1
mchid