我有一些音乐收藏,我想根据它们的截止频率(实际比特率,通常以 kHz 为单位)轻松地对它们进行排序/过滤。我曾经使用 Spek 来显示这些信息,但是 Spek 没有提供在终端或多个文件操作中使用它的可能性。我已经找到了一些方法,但它们都只列出了以 kbps 为单位保存音频文件的比特率,而不是我需要的实际截止频率(以 kHz 为单位)。我想找到一个简单的解决方案,使用例如 bash、python、现有的简单工具等来过滤整个集合。你知道有什么解决方案吗?
澄清:我不是寻找比特率或者采样率,我正在寻找频率截止!
答案1
我一直在寻找类似的东西,因为我正在尝试对大型音乐档案进行重复数据删除,想保留最高质量的文件,但不相信所使用的比特率。
我发现fakeflac这似乎是一个好的开始。不要让名字欺骗你,它不是 FLAC 专用的,因为它将给定的文件转换为 wav 并使用 Python 脚本对其进行操作。它会扫描频谱,直到找到截止点,基于几个启发式方法(在 220 Hz 范围内幅度增加 125%,较低幅度不高于 44100Hz 的 110%)。
它会写出一个“分数”,即截止频率出现在频谱的哪一部分(例如,如果声称的频率是 44100Hz,但截止频率为 22050Hz,则分数为 50)。
我不得不稍微摆弄它才能使其工作,例如我用 替换sndfile-convert foo bar
,ffmpeg -i foo bar
但它非常简单而且似乎正是我想要的。
您可以fakeflac
在循环中使用它来获取文件集合的分数,然后使用标准 shell 工具(sort
、cut
等)对它们进行排序。
答案2
这不是最优雅的解决方案,有一些缺点,但这是我得到的:
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
。最后,输出通过管道传输到 sort 命令,该命令根据第 2 列(数字)按数字排序。
最大的限制是它可以与相同类型的文件配合使用,但是如果混合mp3
和wav
,您会注意到 mp3 文件将其频率列为 44.1 kHz,这会破坏排序。
我有的示例输出,例如:
***./test.wav| 8000|Hz
***./odeath.wav| 44100|Hz
***./Front_Center.wav| 48000|Hz