17

異なるフォーマット/コーデック間でオーディオをデコードおよびエンコードするための C++ ライブラリを作成しています。必要なコーデック ライブラリをロードする前に、フォーマットをすばやく検出するためのルーチンがあります。

WAV ファイルの場合、ファイルの先頭にある ASCII 値 "RIFF" と "WAVE" を簡単に探すことができます。同じことが FLAC にも当てはまります。最初の 4 バイトを読み取るだけで、「fLaC」になります。

しかし、ファイルが MP3 かどうかをすばやく検出するにはどうすればよいでしょうか? ファイル拡張子に頼ることはできません。また、ファイルの先頭に追加のデータ (ID3、カバー画像など) がある可能性があるため、最初の MP3 フレームをデコードしようとすることもできません。

4

1 に答える 1

32

ファイルが MP3 であるかどうかを検出することは、ファイル内の固定パターンを検索するよりも複雑です。

Some concepts

(詳細はhttp://www.codeproject.com/Articles/8295/MPEG-Audio-Frame-Headerを参照してください)

  • MP3 ファイルは一連のフレームで構成され、各フレームの先頭にヘッダーがあります。
  • ヘッダーは、11 ビットの同期ワード (すべて 1) を持つバイト境界で始まります。したがって、同期ワードは 0xFFE または 0XFFF です。
  • 各フレームの長さは、ヘッダー パラメータに基づいて計算されます。

Algorithm to determine if a file is MP3 or not

  • ファイル内の同期ワード (0xFFF または 0xFFE) を検索します。
  • ヘッダー パラメータを解析します。
  • ヘッダー パラメーターを使用してフレームの長さを決定します。
  • フレーム長を使用して次のフレームにシークします。
  • シーク後に別の同期ワードが見つかった場合、そのファイルはほとんどが MP3 ファイルです。
  • 確かに、このプロセスを繰り返して、N 個の連続する MP3 フレームを見つけます。命中率を上げるために N を増やすことができます。
于 2012-07-06T10:32:43.700 に答える