MP3内。 そして、それはどのように配置されていますか?





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を超えるタイプのフレームがあります。







例を考えてみましょう:







この場合、ID3v2ヘッダー(10バイト)とともに-ID3v2データは1024バイトを占有します。



ID3v2ヘッダーの後、タグ自体が移動します。 前述のID3v2タグの読み取りの詳細な分析により、この記事には含まれないことにしました。



これで、ID3タグの存在と長さに関する情報が得られ、mp3フレームの解析を進めて、期間が格納されている場所を理解できます。 そして同時に、他のすべてを理解します。



MP3フレーム





mp3ファイル全体は、順番にしか取得できないフレームで構成されています。 フレームには、ヘッダーとオーディオデータが含まれます。 テープレコーダー用のファームウェアを作成するという目標を設定していないため、フレームヘッダーに関心があります。



彼についての詳細(たくさんのテーブルと乾燥した情報)





ヘッダーサイズは4バイトです。







説明:



データ圧縮モードまたはビットレートとは





データ圧縮には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)



All Articles