web-dev-qa-db-ja.com

kHz単位のカットオフ周波数(実際のビットレート)に従ってオーディオファイルを並べ替える方法は?

いくつかの音楽コレクションがあり、それらのカットオフ周波数(実際のビットレート、通常はkHz。この情報を表示するためにSpekを使用していましたが、Spekは使用する可能性を提供しません)既にいくつかの方法を見つけましたが、それらはすべて、必要な実際のカットオフ周波数(kHz)ではなく、オーディオファイルがkbpsで保存されるビットレートをリストしているだけです。 bash、python、既存のシンプルなツールなどを使用してコレクション全体をフィルタリングするためのシンプルなソリューションを見つけたいと思います。何か解決策を知っていますか?

明確化:私はnotbitrateまたはsampling rateI 'を探していますm周波数カットオフを探しています!

6
aleskva

大規模な音楽アーカイブの重複を排除しようとしているため、最高品質のファイルを保持したいので、使用するビットレートを信頼しないで、似たようなものを探しています。

fakeflac が見つかりました。これは良いスタートのようです。名前をだましてはいけません。指定されたファイルをwavに変換し、Pythonスクリプトを使用して操作するため、FLAC固有ではありません。いくつかのヒューリスティックに基づいて、カットオフが見つかるまで周波数スペクトルをスキャンダウンします(220 Hzの範囲で振幅が125%増加し、44100Hzでの振幅の110%以下)。

「スコア」を書き出します。これは、カットオフが現れる周波数スペクトルの最大距離です(つまり、クレームされた周波数が44100Hzであるが、22050Hzでカットオフすると、スコアは50になります)。

私はそれを機能させるために少しそれをいじらなければなりませんでした。 sndfile-convert foo barffmpeg -i foo barに置き換えましたが、それは非常に簡単で、まさに私が求めているもののようです。

ループでfakeflacを使用してファイルのコレクションのスコアを取得し、標準のシェルツール(sortcutなど)を使用して並べ替えることができます。

2
Warbo

最もエレガントなソリューションではなく、いくつかの欠点がありますが、ここに私が得たものがあります:

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コマンドを使用して、/my/audio/folder内で拡張子が「.wav」のファイルを検索します。各ファイルへのパスを印刷し、3つのワイルドカード記号を埋め込み、それぞれに対してfileコマンドを実行します。 stdoutの出力は、各行を読み取る長いawkコードへのパイプを通ります。行に3つのアスタリスクがある場合-それがファイル名の場合、それを出力します。行のフィールドにHzが含まれている場合、そのフィールドの前に番号とフィールド自体を印刷します。すべてが***/path/to/file | number | (k)Hz形式で出力されるように印刷されます。最後に、出力はsortコマンドにパイプされ、列2(数値)に基づいて数値的にソートされます。

大きな制限は、同じタイプのファイルで問題なく動作することですが、mp3wavを混在させると、mp3ファイルの周波数が44.1 kHzとしてリストされ、ソートが中断されることに気付きます。

私が持っているサンプル出力、例えば:

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