PHPスクリプトでmp3ファイルの継続時間を調べるという、単純な(当時のように思えた)タスクを解決する必要があったら。 ID3タグについて聞いたところ、すぐに期間情報がタグまたはmp3ファイルのヘッダーに保存されていると思いました。 インターネットでの表面的な検索では、この問題を解決するのに数分で機能しないことが示されました。 もともと私は非常に興味があり、時間が尽きていたので、サードパーティのツールを使用せず、自分で最も人気のある形式の1つを見つけ出すことにしました。
中身に興味があるなら、cat(トラフィック)へようこそ。
この記事では、ID3v2タグの抽出については説明しません。さまざまなニュアンスがあるため、これは別の記事に記載できます。 また、現在実際には使用されていないヘッダーのフラグメント(たとえば、mp3フレームのEmphasisヘッダーの一部)。 また、オーディオデータ自体の構造も考慮していません。これは、スピーカーから聞こえるのと同じです。
ID3タグ
ID3(MP3の識別)は、MP3オーディオファイルで最も一般的に使用されるメタデータ形式です。 ID3署名には、トラックの名前、アルバム、アーティスト名などのデータが含まれます。これらのデータは、ファイルに関する情報を表示し、オーディオコレクションを自動的に整理するために、マルチメディアプレーヤーやその他のプログラム、ハードウェアプレーヤーで使用されます。
ウィキペディア
ID3データには、ID3v1とID3v2の2つの完全に異なるバージョンがあります。
ID3v1-128バイトの固定サイズがあり、mp3ファイルの最後に追加されます。 ここに保存できます:トラック名、アーティスト、アルバム、年、コメント、トラック番号(バージョン1.1用)、ジャンル。
すぐに、誰もが128バイトがそのようなデータを保存するための非常に小さな場所であることに気づきました。 したがって、時間が経つにつれて、データの2番目のバージョンが表示され、正常に使用されるようになりました
-ID3v2 。
最初のバージョンとは異なり、v2タグは可変長であり、ファイルの先頭に配置されるため、ストリーミング再生が可能です。 (ID3v2.4形式では、ファイルの最後にデータを保存することもできます)。
ID3v2データは、ヘッダーと後続のID3v2フレームで構成されます。 たとえば、バージョンID3v2.3には70を超えるタイプのフレームがあります。
- マーカーは常に「ID3」に等しい
- 現在、 ID3v2.2、ID3v2.3、およびID3v2.4の3つのバージョンがあります
バージョンv2.2は非推奨です。
v2.3は最も人気のあるバージョンです。
v2.4-人気が高まっています。 v2.3との違いの1つは、UTF-16エンコーディングではなくUTF-8エンコーディングを使用できることです。 - 旗 現在、3(5,6,7)ビットのみが使用されています。
bin:%abc00000
「非同期」-MPEG-2およびMPEG-2.5形式でのみ使用されます。
b「拡張ヘッダー」-拡張ヘッダーの存在を示します
「実験インジケータ」-実験インジケータ - 長さ ID3v2データ長を指定する特性は、各バイトで7番目のビットが使用されず、常に0に設定されることです。
例を考えてみましょう:
この場合、ID3v2ヘッダー(10バイト)とともに-ID3v2データは1024バイトを占有します。
ID3v2ヘッダーの後、タグ自体が移動します。 前述のID3v2タグの読み取りの詳細な分析により、この記事には含まれないことにしました。
これで、ID3タグの存在と長さに関する情報が得られ、mp3フレームの解析を進めて、期間が格納されている場所を理解できます。 そして同時に、他のすべてを理解します。
MP3フレーム
mp3ファイル全体は、順番にしか取得できないフレームで構成されています。 フレームには、ヘッダーとオーディオデータが含まれます。 テープレコーダー用のファームウェアを作成するという目標を設定していないため、フレームヘッダーに関心があります。
彼についての詳細(たくさんのテーブルと乾燥した情報)
ヘッダーサイズは4バイトです。
説明:
- [0-10]マーカー-ユニットで埋められた11ビット(フレーム同期)
- [11-12] MPEGバージョンインデックス(オーディオバージョンID)

- [13-14]レイヤーバージョンインデックス(レイヤーインデックス)
ちなみに、MP3はMPEG-1 Layer IIIです - [15]保護ビット
1-保護なし
0-ヘッダーは16ビットで保護されています。 CRC(見出しに続く) - [16-19]ビットレートインデックス
テーブルはビットレートをキロビット/秒で保存します。 ただし、この形式では、1024ではなく1キロビット= 1000ビットと想定されています。したがって、96 Kbps = 96000ビット/秒です。 - [20-21]サンプリングレートインデックス

- [22]パディングビット
インストールされている場合、データは1バイトシフトされます。 これは、フレームサイズの計算に重要です。 - [23]プライベートビット(情報のみ)
- [24-25]チャンネルモード

- [26-27]チャネルモード拡張。 (モード拡張)ジョイントステレオでのみ使用
- [28]著作権(著作権ビット)-情報提供のみ
- [29]オリジナル(オリジナルビット)-情報提供のみ。
- [30-31]強調(エンファシス)-現在、実際には使用されていません。
データ圧縮モードまたはビットレートとは
データ圧縮には3つのモードがあります。
CBR (固定ビットレート)-固定ビットレート。 トラック全体で変化することはありません。
VBR (可変ビットレート)-可変ビットレート。 この圧縮により、ビットレートはトラック全体で絶えず変化します。
ABR (平均ビットレート)-平均ビットレート。 この概念は、ファイルをエンコードする場合にのみ使用されます。 「出力」で、VBRのファイルが取得されます。
CBR
ファイルが一定のビットレートでエンコードされている場合、
最終的にはでき
ます! 次の式を使用してトラックの継続時間を取得します。
期間=オーディオサイズ/ビットレート(ビット単位!)* 8
たとえば、ファイルのサイズは350,670バイトです。 ID3v1タグ(128バイト)とID3v2タグ(1024バイト)があります。 ビットレート=96。したがって、オーディオデータのサイズは350670-128-1024 = 349518バイトです。
期間= 349518/96000 * 8 = 29.1265 = 29秒
Vbr
圧縮モードの決定方法を説明する必要があります。 すべてがシンプルです。 ファイルがVBRで圧縮されている場合、VBRヘッダーが追加されます。 その存在により、可変ビットレートが使用されていることがわかります。
ヘッダーには、XingとVBRIの2種類があります。
Xingは、表に従って、最初のmp3フレームの先頭からのオフセットで適切な位置に配置されます。
たとえば、ID3v2タグは1024バイトを占有します。 mp3ファイルに「ステレオ」チャンネルモードがある場合、VBR Xingヘッダーは1024 + 32 = 1056バイトのオフセットで始まります。
VBRIヘッダーは常に、最初のmp3フレームの先頭から+32バイトのオフセットで配置されます。
両方のヘッダーの最初の4バイトには、Xingの「Xing」または「Info」トークンが含まれています。 VBRIの場合は「VBRI」。
これらのVBRヘッダーは長さが可変で、さまざまなファイルエンコーディング情報が含まれています。 VBRヘッダーの構造に関する詳細情報(およびそれだけではありません)は、たとえば
ここにあります 。
現時点で私たちが興味を持っているものだけを紹介します。 つまり、フレーム数(フレーム数)。 この数は4バイトです。
Xingヘッダーには、ヘッダーの先頭から+8バイトのオフセットが含まれます。 VBRIでは、ヘッダーの先頭から+14バイト。
Sampler Per Frameテーブルを使用すると、可変ビットレートでエンコードされたmp3ファイルの継続時間を取得できます。
期間=フレーム数*フレームあたりのサンプル数/サンプルレート
たとえば、VBRIヘッダーでは、フレーム数は1118、フレームあたりのサンプル= 1152、サンプリング周波数= 44100です。
期間= 1118 * 1152/44100 = 29.204 = 29秒。
今日は以上です。 それが誰かに有用だったら-
ありがとう 。
すぐにmp3の中を掘り下げたい人のために-この記事とテスト用の4つの小さなmp3ファイルを同時に作成したphpスクリプトがあります。
参照資料
id3.org-ID3について読む
id3.org-およびmp3フレームについて
mp3フレームについてかなり詳細
getID3:mp3に関する情報を取得するための優れたライブラリ。 (Php)