5. シーク機能で意外に苦戦
MPEG フレームのサイズは計算で得られるから、ちょろいちょろい。
と思って実装を始めたら全然合わない。計算してシークした先がMPEGフレームの先頭に一致しない。フレームの構造をよく見ると、ときおりフレームサイズが1バイト増えている。確かに padding の有無を示すビットがヘッダにあるけれど。bitrateに正確に合わせるためか?
仕方がないので、MPEGのフレーム開始位置に正確に飛ぶのはあきらめて、ビットレートと飛び先の秒数からファイル位置を計算し、そこにシークしてから、MPEGフレームの検索処理に任せることにした。
雑な処理のわりに調子よく動いてるな。と思いつつ、キーを押すと10秒飛ばす処理で試してたら、たまにMP3のデコードがエラーになる。
エラー発生時のデータをダンプしてみてみると、ヘッダのデータが微妙におかしい。
どうやら、使ってるデコーダのMPEGフレーム検索処理は「きちんと処理できている」のが前提で、ファイルの途中から正しいフレームを検索する目的には使えないようだ。まぁそりゃそうか。
原因さえわかれば検索処理を作り直すだけだ!とか思ったが、デコードエラーが起きたら次のフレームを探して再生。を繰り返せばそのうち正常に戻るんでは?と気が付いた。
ちょっと気持ち悪いが、動くようになったんでヨシ!
まぁ、動画にした場合に音ズレ起こしそうだけど。。。




