Как отсортировать аудиофайлы по частоте среза (реальная скорость передачи битов) в кГц?
У меня есть музыкальная коллекция, и я хочу легко отсортировать / отфильтровать их по частоте среза (реальный битрейт, обычно в кГц). Я использовал Spek для отображения этой информации, но Spek не предоставляет никакой возможности использовать это в терминале или для операций с несколькими файлами. Я уже нашел несколько способов, но все они просто перечисляют битрейт, в котором аудиофайл сохраняется в кбит / с, а не фактическую частоту среза в кГц, которая мне нужна. Хотите найти простое решение для фильтрации всей коллекции, используя, например, bash, python, существующий простой инструмент и т. д. Знаете ли вы какое-либо решение?
Уточнение: я не ищу битрейт или частоту дискретизации, я ищу обрезание частоты!
2 ответа
Я искал что-то похожее, так как я пытаюсь воспроизвести большой музыкальный архив, хотел бы сохранить файлы самого высокого качества, но не доверяю используемым битрейтам.
Я нашел поддельный флаг, который кажется хорошим началом. Не позволяйте имени обмануть вас, оно не зависит от FLAC, поскольку оно преобразует данный файл в wav и работает с ним, используя скрипт Python. Он сканирует частотный спектр до тех пор, пока не найдет срез, основываясь на нескольких эвристиках (увеличение на 125% по амплитуде в диапазоне 220 Гц, с меньшей величиной, не превышающей 110% по сравнению с частотой 44100 Гц).
Он записывает "оценку", которая показывает, как далеко вверх по частотному спектру появляется срез (т. Е. Если заявленная частота равна 44100 Гц, но она обрезается при 22050 Гц, оценка будет равна 50).
Мне пришлось немного поиграться, чтобы он заработал, например я заменил sndfile-convert foo bar
с ffmpeg -i foo bar
, но это очень просто и, кажется, именно то, что я после.
Ты можешь использовать fakeflac
в цикле, чтобы получить оценки для коллекции файлов, а затем отсортировать их с помощью стандартных инструментов оболочки (sort
, cut
, так далее.).
Не самое элегантное из решений, имеет несколько недостатков, но вот что я получил:
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
В основном мы используем find
команда для поиска файлов с расширением.wav, внутри /my/audio/folder
, Мы печатаем путь к каждому файлу, дополняем его тремя подстановочными знаками и выполняем file
Команда на каждом из них. stdout
выход идет через трубу в длину awk
код, который читает каждую строку; если в строке три звездочки - это имя файла, выведите его; если поле в строке содержит Hz
в нем мы печатаем число перед этим полем и само поле. Все напечатано таким образом, чтобы иметь вывод в формате ***/path/to/file | number | (k)Hz
, Наконец, выходные данные передаются по команде сортировки, которая осуществляет числовую сортировку по столбцу 2 (число).
Большим ограничением является то, что он работает нормально с файлами того же типа, но если вы смешаете mp3
а также wav
, затем вы замечаете, что mp3-файлы имеют частоту 44,1 кГц, и это нарушает сортировку.
Пример вывода, который у меня есть, например:
***./test.wav| 8000|Hz
***./odeath.wav| 44100|Hz
***./Front_Center.wav| 48000|Hz