4. 動画ではシーク機能がないと不便だ
映画を流してて気が付いた。早送りできないと使いづらい。
早送りするには、映像と音声を任意の箇所に進める機能が必要。
映像は tar でまとめてるだけなので、頭から全部スキャンしないとだめ。(JPEGデータ本体はスキップできるけど、ヘッダを追うだけでもファイルアクセス処理が重そうだ)
音声はMPEGフレームを見ていかないとダメなので、かなり重そう。ただCBR(固定ビットレート)なら、サイズが固定のはずなので、一気にジャンプできそう。
検索すると、フレームサイズは特定の計算式で出せるようだ。なるほど、MP3プレイヤーを作ってるとき、何種類かのパターンがあった記憶と一致する。
では検証しようと、いろんな種類のMP3ファイルを作ってバイナリエディタで調べたら、22kHzのサンプリングレートでは計算が合わない。(具体的にはフレームサイズが44kHzの時の半分になってる)
ファイルサイズを見ていたら、ステレオとモノラルではファイルサイズが同じだとか、サンプリングレートを落としてもファイルサイズが大きい場合があるのにも気が付いた。
なんじゃこりゃ??
仕方がないのでデコーダのソースを見はじめて気が付いたこと。
MPEG-1の他にMPEG-2 や MPEG-2.5 ってのがある。確かにヘッダの解説の中にそんなのがあったけど…
調べた結果が以下。
・MP3のビットレートとはデータ量を規定する。モノラル/ステレオを変更してもデータ量は同じ。
ジョイントステレオという、左右の差分を使うモードを想定しているようだ。
(つまりモノラルの方が音が良いのか?)
・MP3とは、MPEG-1 layer3 のことだが、サンプリングレートが低いとMPEG-2やMPEG-2.5になる。
MPEG-1 (44.1kHz, 48kHz, 32kHz)が標準
サンプリング周波数がMPEG-1の半分だとMPEG-2 (22.05kHz, 24kHz, 16kHz)
更に低くなると、MPEG-2.5 (11kHz, 12kHz, 8kHz)
・ビットレートとサンプリングレートの組み合わせ(必要以上にビットレートが高い)の場合は、layer3 じゃなくて layer 1 になって計算式が変わる。
(もしかしたら音質も悪いかも)
つまりはむやみにビットレートやサンプリングレートを変えてもいい結果がでないという感じ。
CPU負荷を考えてサンプリングレートは22kHz (または元データの 1/2 )
ビットレートは 80k or 96k (通常の MP3 の 160kbps, 192kbps相当)
が妥当かな。
動画再生用ならこのビットレートで決め打ちでいいんだが、どうせならMP3プレイヤーにもシークを追加すしたいので、ちゃんとした方がいいだろう。
ということで、MP3デコーダのドライバにAPIを追加して、MPEG フレームサイズを取得して、それをシーク用に使うことにした。
なおVBRの場合は、フレームサイズが変化して面倒なので先送り。(XINGというフレームにファイル全体の情報が入っているらしいが面倒)
まぁこんな構造でファイルができているなら、DVDやBDのディスクの早送りが2倍、4倍、8倍みたいになってるのもあたりまえか。
ファイルを頭から検索して、ヘッダを読んで先に飛んでを繰り返すだけでいいんだし。




