web-dev-qa-db-fra.com

Comment trier les fichiers audio en fonction de leur fréquence de coupure (débit réel) en kHz?

J'ai une collection de musique et je veux les trier/filtrer facilement en fonction de leur fréquence de coupure (débit réel, généralement en kHz. J'avais l'habitude d'utiliser Spek pour me montrer cette information, mais Spek ne fournit aucune possibilité d'utilisation J'ai déjà trouvé des solutions, mais toutes indiquent simplement le débit binaire dans lequel le fichier audio est enregistré en kbps, et non la fréquence de coupure réelle en kHz, ce dont j'ai besoin. voulez trouver une solution simple pour filtrer toute la collection en utilisant par exemple bash, python, un outil simple existant, etc. Connaissez-vous une solution?

Précision: je suis pas je recherche un débit binaire ou , Je cherche une fréquence coupée!

6
aleskva

Je cherche quelque chose de similaire, depuis que je tente de dupliquer une grande archive musicale, aimerais conserver des fichiers de la plus haute qualité, mais ne faites pas confiance aux débits utilisés.

J'ai trouvé fakeflac ce qui semble être un bon début. Ne laissez pas le nom vous tromper, il n'est pas spécifique à FLAC puisqu'il convertit le fichier donné en wav et le gère à l'aide d'un script Python. Il balaye le spectre de fréquences jusqu'à trouver la coupure, en se basant sur quelques heuristiques (augmentation de 125% de l'amplitude sur une plage de 220 Hz, l'amplitude inférieure ne dépassant pas 110% de celle de 44100Hz).

Il écrit un "score", c'est-à-dire jusqu'à quel point la fréquence de coupure apparaît dans le spectre de fréquences (c'est-à-dire si la fréquence revendiquée est 44100Hz mais qu'elle est coupée à 22050Hz, le score sera de 50).

Je devais le tripoter un peu pour le faire fonctionner, par exemple. J'ai remplacé sndfile-convert foo bar par ffmpeg -i foo bar, mais c'est très simple et semble être exactement ce que je recherche.

Vous pouvez utiliser fakeflac dans une boucle pour obtenir les scores d'une collection de fichiers, puis les trier à l'aide des outils Shell standard (sort, cut, etc.).

2
Warbo

Pas la plus élégante des solutions, elle a quelques inconvénients, mais voici ce que j'ai obtenu:

find . -type f -name "*.wav"  -printf "***%p\n"  -exec file {} \; | awk '/\*\*\*/{printf $0"|"};{gsub(/\,/,"");for(i=1;i<=NF;i++) if($i~/Hz/) printf " "$(i-1)"|"$i"\n" }' | sort --field-separator="|" --numeric -k 2

Fondamentalement, nous utilisons la commande find pour rechercher des fichiers avec l'extension ".wav", à l'intérieur de /my/audio/folder. Nous imprimons le chemin d'accès à chaque fichier en y ajoutant trois caractères génériques, puis exécutons la commande file sur chacun d'entre eux. La sortie stdout passe par pipe au long code awk, qui lit chaque ligne; si la ligne a trois astérisques - c'est le nom du fichier, imprimez-le; si un fichier dans une ligne contient Hz, nous imprimons le numéro avant ce champ et le champ lui-même. Tout est imprimé de manière à avoir une sortie au format ***/path/to/file | number | (k)Hz. Enfin, la sortie est dirigée vers la commande de tri, qui trie numériquement sur la base de la colonne 2 (le nombre).

La grande limite est que cela fonctionne bien avec le même type de fichiers, mais si vous mélangez mp3 et wav, vous remarquerez que les fichiers mp3 affichent une fréquence de 44,1 kHz, ce qui annule le tri.

Exemple de sortie que j'ai, par exemple:

***./test.wav| 8000|Hz
***./odeath.wav| 44100|Hz
***./Front_Center.wav| 48000|Hz
1