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