iTunesで昨日からiPodTouch用にエンコード中

で、たまにファイルがおかしなことになってるのに気づいた。

ビットレートの表示がおかしくなるのだ。(MP3)

そのせいで、総再生時間が正しく算出されておらず、

数分の曲が数十分などの表示になっている。


で、どうしてかなと思って調べてみた。

ニコニコ動画で抽出したFLVファイルから

MP3を抽出したJAMProjectのskillのLive版を実験台に。

抽出したままだと160kbpsなのだが、

iTunesに入れると、8kbpsと表示される。


で、バイナリでMP3ファイルを見てみたところ、

SYNCHeaderが「FF F3 10 C4」・「FF F3 09 C4」・・・

とどうやらVBRらしい。

で、ビットレートの平均はどうやら56kbpsか64kbpsくらい、

最大ビットレートは160kbps

最低ビットレートは8kbps

一番最初のフレームのビットレートは8kbps


ここからは予想だけど、

iTunesのシーケンス的には、

一番最初のフレームのビットレートから再生時間を算出すると思われる。

MP3の場合、一番最初のフレームの位置は、

ID3v2タグがあれば、タグをデコードしてサイズを割り出し、その次の位置

ID3v2タグがなければ先頭と決まっている。

そのため、算出が一番楽な方法だ。

ビットレートが算出できれば、

後はファイルサイズをビットレートで割ってやれば総再生時間が算出できる。


しかし、VBRだとビットレートが可変なため、それでは正しい再生時間を算出できない。

しかも、ファイルの先頭のパケットだと、

普通の曲の場合、先頭は無音状態から始まる為、

かなり圧縮された低いビットレート値が入っている。

そのため、再生時間が大幅に大きくなってしまうのだろう。

(VBRでも先頭フレームに、XING情報タグを付ければiTunesでも正しくVBRと表示され、再生時間も正しく取得できる)


てか、せめてその曲の再生を開始したら修正して欲しいものだ。

先頭一フレームを読み込むのは、曲数が多くなったときに、

正しい時間を算出すると時間とメモリを消費するので節約のために行っているのだろうが、

再生を開始したら、その曲を丸ごとロードするのだから、

全て解析して正しい時間が出せるはず。


MP3は規格がゆるゆるだから使いやすいが、

プレーヤー側が弱いとひどいことになるね。