1

クラスのseekto()メソッドで使用されるバイト単位のオフセットを取得しようとしています。MediaPlayer

どうにかしてこの情報を直接取得する方法があるかどうか疑問に思っていました。そうでない場合は、たとえば、自分で計算する必要がある場合:次の計算を使用できます。

10(secs)*(bit rate per second)/8

がクラスMediaPlayerを使用してビット レート情報を取得すると仮定できますか?MediaMetadataRetriever

私は以下を読みました: Accuracy of MediaPlayer.seekTo(int msecs) そして、私は可変ビットレートの問題を認識していますが、メソッドの精度を探しているのではseekto()なく、メソッドに使用する値を取得/計算する方法を探しています新しいデータを取得するためのオフセット。

4

1 に答える 1

1

seekTo()オフセットに基づいて実装するというあなたの目的は斬新ですが、同じものに複数の課題が付随しています。seekTo()実装に入る前に、MediaPlayerとについていくつか説明しMediaMetadataRetrieverます。これらのクラスは両方とも、情報MediaExtractorを取得するために内部的にオブジェクトを使用しmetadataます。したがって、クラスは含まれMediaPlayer ません。MediaMetadataRetriever

まず、ビットレートの抽出について考えてみましょう。MediaPlayerは、複数のファイル形式をサポートする必要がある一般的な実装です。したがって、デザインでは、、、などのオーディオビジュアル形式や、などのオーディオ形式など、システムでサポートされているすべてのファイル形式でパラメータが抽出されるようにする必要があります。最新のandroid実装bitrateでは、キーを介してビットレートを公開しているだけです。MP4MPEG-2 TSAVIMatroskaWAVMP3MP3ExtractorkKeyBitrate

次に、あなたのアルゴリズムに来ると、サイズベースのシークに付随する次の課題が見つかります。

  1. audiovideoトラックはインターリーブ方式で保存されます。したがって、time * bitrate (in bytes)入力データのインターリーブの性質により、直接役立つことはありません。

  2. 開始オフセットを考慮する必要があります。ファイルには、ファイル形式に固有のファイルの先頭に保存されているものがありますmetadataboxesこのオフセットも考慮する必要があります。これは、フォーマットごとに異なります。

  3. 入力に、、、などのトラックの数が多い場合、または映画のようaudioに複数のトラックがある場合、問題はより複雑になります。videotextaudio

  4. ビデオフレームは通常、サイズが不規則です。固定ビットレートモデルが採用されている場合でも、ビデオフレームサイズはフレームのタイプによって大幅に異なる可能性があります。通常、はまたI-frame / IDR-Frame in H.264はと比較して多数のビットを消費する可能性がありP-frameますB-frame。これは、サイズベースのseekTo()実装に実際的な問題を引き起こします。IフレームとPフレームのフレームサイズに関して1:5の比率を簡単に観察できます。

  5. あなたがすでに認めている可変ビットレートモデルの明確な影響があります。したがって、私はこの点をスキップしています。

前述の点で、あなたを落胆させることなく、sizeベースの実装は難しいように見えると思います。

于 2013-03-24T00:52:27.253 に答える