seekTo()オフセットに基づいて実装するというあなたの目的は斬新ですが、同じものに複数の課題が付随しています。seekTo()実装に入る前に、MediaPlayerとについていくつか説明しMediaMetadataRetrieverます。これらのクラスは両方とも、情報MediaExtractorを取得するために内部的にオブジェクトを使用しmetadataます。したがって、クラスは含まれMediaPlayer ません。MediaMetadataRetriever
まず、ビットレートの抽出について考えてみましょう。MediaPlayerは、複数のファイル形式をサポートする必要がある一般的な実装です。したがって、デザインでは、、、などのオーディオビジュアル形式や、などのオーディオ形式など、システムでサポートされているすべてのファイル形式でパラメータが抽出されるようにする必要があります。最新のandroid実装bitrateでは、キーを介してビットレートを公開しているだけです。MP4MPEG-2 TSAVIMatroskaWAVMP3MP3ExtractorkKeyBitrate
次に、あなたのアルゴリズムに来ると、サイズベースのシークに付随する次の課題が見つかります。
audiovideoトラックはインターリーブ方式で保存されます。したがって、time * bitrate (in bytes)入力データのインターリーブの性質により、直接役立つことはありません。
開始オフセットを考慮する必要があります。ファイルには、ファイル形式に固有のファイルの先頭に保存されているものがありますmetadata。boxesこのオフセットも考慮する必要があります。これは、フォーマットごとに異なります。
入力に、、、などのトラックの数が多い場合、または映画のようaudioに複数のトラックがある場合、問題はより複雑になります。videotextaudio
ビデオフレームは通常、サイズが不規則です。固定ビットレートモデルが採用されている場合でも、ビデオフレームサイズはフレームのタイプによって大幅に異なる可能性があります。通常、はまたI-frame / IDR-Frame in H.264はと比較して多数のビットを消費する可能性がありP-frameますB-frame。これは、サイズベースのseekTo()実装に実際的な問題を引き起こします。IフレームとPフレームのフレームサイズに関して1:5の比率を簡単に観察できます。
あなたがすでに認めている可変ビットレートモデルの明確な影響があります。したがって、私はこの点をスキップしています。
前述の点で、あなたを落胆させることなく、sizeベースの実装は難しいように見えると思います。