Como ordenar arquivos de áudio de acordo com sua freqüência de corte (taxa de bits real) em kHz?

6

Eu tenho uma coleção de músicas e quero classificá-las / filtrá-las facilmente de acordo com sua frequência de corte (taxa de bits real, geralmente em kHz. Eu costumava usar o Spek para me mostrar essas informações, mas a Spek não fornece possibilidade de usá-lo no terminal ou para múltiplas operações de arquivos.Eu já encontrei algumas maneiras, mas todas elas apenas listam taxa de bits em que o arquivo de áudio é salvo em kbps, não a freqüência de corte real em kHz, que eu Eu quero encontrar uma solução simples para filtrar toda a coleção usando, por exemplo, bash, python, ferramenta simples existente, etc. Você conhece alguma solução?

Esclarecimento: não estou procurando taxa de bits ou taxa de amostragem , estou procurando o corte de frequência!

    
por aleskva 01.11.2015 / 02:04

2 respostas

3

Estou à procura de algo semelhante, já que estou tentando desmembrar um grande arquivo de músicas, gostaria de manter os arquivos da mais alta qualidade, mas não confie nas taxas de bits usadas.

Eu encontrei fakeflac que parece ser um bom começo. Não deixe o nome enganá-lo, não é específico do FLAC, pois ele converte o arquivo fornecido em wav e opera nele usando um script Python. Ele varre o espectro de freqüência até encontrar o ponto de corte, baseado em um par de heurísticas (aumento de 125% na magnitude em uma faixa de 220 Hz, com uma magnitude menor não superior a 110% daquela em 44100Hz).

Escreve uma "partitura", que é a que ponto do espectro de frequências o cutoff aparece (ou seja, se a frequência reivindicada for 44100Hz, mas cortada a 22050Hz, a pontuação será 50).

Eu tive que mexer com isso um pouco para que funcionasse, por exemplo Eu substituí sndfile-convert foo bar por ffmpeg -i foo bar , mas é muito simples e parece ser exatamente o que eu estou procurando.

Você pode usar fakeflac em um loop para obter as pontuações de uma coleção de arquivos e, em seguida, classificá-las usando ferramentas de shell padrão ( sort , cut , etc.).

    
por Warbo 16.05.2016 / 20:47
1

Não é a mais elegante das soluções, tem algumas desvantagens, mas aqui está o que eu tenho:

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

Basicamente, usamos o comando find para procurar arquivos com a extensão ".wav", dentro de /my/audio/folder . Nós imprimimos o caminho para cada arquivo, preenchendo-o com três sinais curinga e executando o comando file em cada um deles. A saída stdout passa pelo canal até o longo código awk , que lê cada linha; se a linha tiver três asteriscos - é o nome do arquivo, imprima; se um campo em uma linha contiver Hz , nós imprimiremos o número antes daquele campo e o próprio campo. Tudo é impresso de maneira a ter saída no formato ***/path/to/file | number | (k)Hz . Finalmente, a saída é canalizada para o comando sort, que classifica numericamente com base na coluna 2 (o número).

A grande limitação é que funciona bem com o mesmo tipo de arquivos, mas se você misturar mp3 e wav , você notará que os arquivos mp3 listam sua frequência como 44,1 kHz e que quebra o tipo.

Exemplo de saída que tenho, por exemplo:

***./test.wav| 8000|Hz
***./odeath.wav| 44100|Hz
***./Front_Center.wav| 48000|Hz
    
por Sergiy Kolodyazhnyy 04.11.2015 / 00:51