Je suis entrain d'essayer de faire un script pour convertir tous les fichiers mp3 d'un dossier et de ses sous-dossiers (c'est important ça change tout) en .ogg. J'ai un petit souci pour lister l'ensemble des fichiers mp3 et pour que la boucle 'for' les traite comme je veux.
Jusqu'ici, je me contentais de ceci :
#Conversion depuis mp4
for i in *.mp3;
do ffmpeg -i "$i" -map_meta_data "${i%mp3}flac":"$i" "${i%mp3}flac";
        oggenc -b 128 "${i%mp3}flac";
done 
Cela fonctionne très bien, sauf que ça ne va pas dans les sous-dossiers.

Je suis entrain d'essayer ceci :
mp3list=$(find . -name '*.mp3');
mp3list=${mp3list//\ /\\\ };
#Conversion depuis mp3
for i in $mp3list;
do ffmpeg -i "$i" -map_meta_data "${i%mp3}flac":"$i" "${i%mp3}flac";
        oggenc -b 128 "${i%mp3}flac";
        rm ${i%mp3}flac;
done
Malheureusement, "ça marche pas". Je me suis dit que c'était les espaces dans les nom de fichier qui lui posaient problème. Que nenni. en les remplaçant par '\ ' c'est-à-dire en échappant l'espace, ça veut toujours pas.
J'espère que je suis assez clair...
Est-ce qqn sait comment demander à une boucle for de traiter une liste de fichiers contenu dans une variable ?

PS : ça n'a rien à voir, mais je fais la conversion en 2 étapes (en passant par un .flac) parce que je n'ai pas trouvé comment convertir directement en .ogg avec ffmpeg ou mencoder, et oggenc ne lit pas directement les mp3...
Bonjour,
mais je fais la conversion en 2 étapes (en passant par un .flac) parce que je n'ai pas trouvé comment convertir directement en .ogg avec ffmpeg ou mencoder, et oggenc ne lit pas directement les mp3...
Le plus simple serait de convertir les fichiers MP3 en fichiers WAV dans un premier temps (avec lame par exemple), puis ces derniers en OGG. C'est sans doute plus rapide ainsi.
Pour contourner les soucis d'espaces dans les noms de fichiers, tu peux lire la sortie de find ligne par ligne, avec read.
Ci-dessous, une solution reprenant mes suggestions :

#Conversion depuis mp3
find . -name "*.mp3" | while read i; do
        # conversion mp3 -> wav
        lame --decode "$i" "$i.wav"
        # conversion wav -> ogg
        oggenc -b 128 "$i.wav" -o "${i%.mp3}.ogg"
        rm "$i.wav"
done
Je sens qu'on s'approche, le souci, c'est qu'il ne traite que le premier fichier...

Et pour FLAC, si j'utilise ce format comme transition c'est parce qu'il est assez rapide à compresser (moins que WAV c'est vrai) et il a l'avantage de conserver le tag...
patou355 wrote:Je sens qu'on s'approche, le souci, c'est qu'il ne traite que le premier fichier...
« find . -name "*.mp3" » renvoie combien de fichiers ?
Et pour FLAC, si j'utilise ce format comme transition c'est parce qu'il est assez rapide à compresser (moins que WAV c'est vrai) et il a l'avantage de conserver le tag...
Je comprends la problématique du tag, effectivement, quoique ça fasse un peu usine à gaz ^^.
find . -name "*.mp3" renvoie :
./Enya (1997) - A Box Of Dreams - CD1 - Oceans/02 - Caribbean Blue.mp3
./Enya (1997) - A Box Of Dreams - CD1 - Oceans/04 - Anywhere Is (Edit).mp3
./Enya (1997) - A Box Of Dreams - CD1 - Oceans/01 - Orinoco Flow.mp3
./Enya (1997) - A Box Of Dreams - CD1 - Oceans/06 - the Celts.mp3
./Enya (1997) - A Box Of Dreams - CD1 - Oceans/05 - Only If ....mp3
./Enya (1997) - A Box Of Dreams - CD1 - Oceans/12 - The Longships.mp3
./Enya (1997) - A Box Of Dreams - CD1 - Oceans/09 - China Roses.mp3
./Enya (1997) - A Box Of Dreams - CD1 - Oceans/07 - Cursum Perficio.mp3
./Enya (1997) - A Box Of Dreams - CD1 - Oceans/15 - Boadicea.mp3
./Enya (1997) - A Box Of Dreams - CD1 - Oceans/10 - Storms in Africa.mp3
./Enya (1997) - A Box Of Dreams - CD1 - Oceans/03 - Book of Days (English Lyric).mp3
./Enya (1997) - A Box Of Dreams - CD1 - Oceans/11 - Pax Deorum.mp3
./Enya (1997) - A Box Of Dreams - CD1 - Oceans/08 - I Want Tomorrow.mp3
./Enya (1997) - A Box Of Dreams - CD1 - Oceans/13 - Ebudæ.mp3
./Enya (1997) - A Box Of Dreams - CD1 - Oceans/14 - On My Way Home (Remix).mp3
Et l'unique fichier traité est le premier renvoyé, c'est-à-dire Caribbean blue...
J'utilise id3cp pour copier les tags d'un mp3, mais je ne sais pas si fonctionne avec les ogg.

PS: D'après ce script ça fonctionne aussi.
Bonjour,
tu mets au point ton script pour un fichier : ce script prenant en paramètre le nom du fichier à traiter puis tu fais :
find . -name '*.mp3' -exec LESCRIPT.sh {} \;
DalP wrote:J'utilise id3cp pour copier les tags d'un mp3, mais je ne sais pas si fonctionne avec les ogg.
Ça ne risque hélas pas de fonctionner parce que les fichiers OGG n'utilisent pas le système de tags ID3.

patou355 : ce que tu dis m'intrigue fortement... Exécutes-tu exactement ce que j'ai posté, ou as-tu adapté mon script ? Dans ce dernier cas, peux-tu poster ta nouvelle version ?
Oui j'ai adapté, mais ce qui me surprend vraiment, c'est que le premier fichier de la liste est converti en .ogg comme je veux, c'est juste qu'après, ça s'arrête :
find . -name "*.mp3" | while read i; 
do ffmpeg -i "$i" -map_meta_data "${i%mp3}flac":"$i" "${i%mp3}flac";
        oggenc -b 128 "${i%mp3}flac";
        rm "${i%mp3}flac";
        echo $i;
done 
echo $i; c'est pas pour le script, mais pour faire un petit diagnostic de la variable i.

Elle contient bien :
./Enya (1997) - A Box Of Dreams - CD1 - Oceans/02 - Caribbean Blue.mp3
C'est-à-dire le fichier qui est converti sans problème. Par contre, je pense qu'il y a un souci avec le while, mais alors comme je suis pas calé du tout...
Je vais aussi gratter vers la solution proposée par Proxy... dans un second temps 🙂
C'est assez subtil comme comportement... Le coupable est ffmpeg qui, durant son exécution, lit aussi sur l'entrée standard et court-circuite du coup read. Pour arranger ça, rajoute « </dev/null » au bout de la commande ffmpeg :
find . -name "*.mp3" | while read i; 
do ffmpeg -i "$i" -map_meta_data "${i%mp3}flac":"$i" "${i%mp3}flac" </dev/null;
        oggenc -b 128 "${i%mp3}flac";
        rm "${i%mp3}flac";
        echo $i;
done 
Effectivement c'était subtil ! Je pense pas que j'aurais pu trouver ça tout seul.
Est-ce que ça veut dire que ffmpeg "mange" l'entrée standard, c'est-à-dire ce qui est envoyé par find ?
Qu'est-ce que /dev/null ? ce n'est ni un fichier ni un dossier on dirait... Est-ce un lecteur, comme /dev/sda mais qui ne contiendrait rien ?
rm "${i%mp3}flac" est censé effacer le fichier de transition FLAC, mais ne le fait pas. WTH ? ça fonctionnait dans l'ancienne version du script...
Pour la définition de /dev/null : http://fr.wikipedia.org/wiki//dev/null
Est-ce que ça veut dire que ffmpeg "mange" l'entrée standard, c'est-à-dire ce qui est envoyé par find ?
Exactement.
rm "${i%mp3}flac" est censé effacer le fichier de transition FLAC, mais ne le fait pas. WTH ? ça fonctionnait dans l'ancienne version du script...
Pourrais-tu poster les traces d'exécution du script ?
En fait j'ai trouvé :
Il cherchait à supprimer un fichier dont le nom finit par .mp3.flac. Donc en remplaçant
rm "$i.flac";
par
rm "${i%.mp3}.flac";
Tout rentre dans l'ordre...
patou355 wrote:En fait j'ai trouvé :
Il cherchait à supprimer un fichier dont le nom finit par .mp3.flac. Donc en remplaçant
rm "$i.flac";
par
rm "${i%.mp3}.flac";
Tout rentre dans l'ordre...
Les comamndes que tu as postées indiquaient pourtant bien « rm "${i%.mp3}.flac" ». Pas bien ça, tu veux faire peur ? ^^
Et on peut même supprimer les points :
rm "${i%mp3}flac";
ce qui est assez logique finalement...
Effectivement, je l'ai peut-être changé par erreur entre temps, puis je suis revenu aux bases... enfin tj est-il que ça marche pour les mp3.

Je vais maintenant l'adapter pour wma (si si), flv (et oui encore plus dingue), flac et mp4.

Ensuite, j'aurais un scrpt de la mort qui convertit tout en .ogg
Voilà, on s'approche d'un résultat final qui fonctionne bien, en tout cas dans le cadre du test que je viens d'effectuer.
#!/bin/bash

#Conversion depuis mp3
find . -name "*.mp3" | while read i; 
do ffmpeg -i "$i" -map_meta_data "${i%mp3}flac":"$i" "${i%mp3}flac" </dev/null;
        oggenc -b 128 "${i%mp3}flac";
        rm "${i%.mp3}.flac";
        rm "$i";
done

#Conversion depuis mp4
find . -name "*.mp4" | while read i; 
do ffmpeg -i "$i" -map_meta_data "${i%mp4}flac":"$i" "${i%mp4}flac" </dev/null;
        oggenc -b 128 "${i%mp4}flac";
        rm "${i%.mp4}.flac";
        rm "$i";
done

#Conversion depuis m4b
find . -name "*.m4b" | while read i; 
do ffmpeg -i "$i" -map_meta_data "${i%m4b}flac":"$i" "${i%m4b}flac" </dev/null;
        oggenc -b 128 "${i%m4b}flac";
        rm "${i%.m4b}.flac";
        rm "$i";
done

#Conversion depuis flv (fucking l*** video)
find . -name "*.flv" | while read i; 
do ffmpeg -i "$i" -map_meta_data "${i%flv}flac":"$i" "${i%flv}flac" </dev/null;
        oggenc -b 128 "${i%flv}flac";
        rm "${i%.flv}.flac";
        rm "$i";
done


#Conversion depuis wma
find . -name "*.wma" | while read i; 
do ffmpeg -i "$i" -map_meta_data "${i%wma}flac":"$i" "${i%wma}flac" </dev/null;
        oggenc -b 128 "${i%wma}flac";
        rm "${i%.wma}.flac";
        rm "$i";
done


#Conversion depuis flac
find . -name "*.flac" | while read i; 
do      oggenc -b 128 "$i";
        rm "$i";
done
Avec tous mes remerciements à Pikachu 🙂
Ce n'est pas fini 🙂. C'est dommage qu'il y ait ici duplication de code, on peut largement condenser :
# Une liste des types de fichiers à convertir, par extension
TYPES_SUPPORTES="mp3 mp4 m4a flac flv wma"

# On va parcourir tous les fichiers de l'arborescence, quels qu'ils soient
find . -type f | while read i; do
   # on récupère l'extension du fichier traité
   ext=${i##*.}

   # Si l'extension n'est pas dans la liste TYPES_SUPPORTES, le fichier est ignoré et on passe au suivant
   grep -q "$ext" <<<"$TYPES_SUPPORTES" || continue

   # On ne convertit évidemment pas les fichiers FLAC avec ffmpeg, c'est déjà fait...
   [ $ext != flac ] && ffmpeg -i "$i" -map_meta_data "${i%$ext}flac":"$i" "${i%$ext}flac" </dev/null

   oggenc -b 128 "${i%$ext}flac"

   rm "${i%$ext}flac"
done
Ainsi, pour convertir d'autres types de fichiers supportés par ffmpeg avec la même commande, tu n'aurais qu'à rajouter l'extension associé à la variable TYPES_SUPPORTES.

Es-tu cependant sûr de vouloir supprimer les fichiers FLAC originaux dans ton bloc « #Conversion depuis flac » ?
Bon, là je peux pas lutter 🙂

Par contre j'ai pas compris pk tu dis que la conversion en .flac est déjà faite...

et je vois pas non plus le lien entre TYPES_SUPPORTES et le 'find -type -f'