6

現在、Android Jelly Bean MediaCodec API を使用して、単純なビデオ プレーヤーを開発しています。

トラックを抽出し、オーディオとビデオを別々のスレッドで再生します。問題は、ビデオ トラックの再生が常に速すぎることです。

問題はどこに隠されていますか?
オーディオとビデオはほぼ同じように扱われますが、オーディオは AudioTrack を介して再生され、ビデオはサーフェスにレンダリングされます。

4

1 に答える 1

4

フレームを最大速度でレンダリングすると、ほとんどのデバイスで 60 fps に達します。エンコーダーによって提供されるプレゼンテーション タイム スタンプに従って、ペースを調整する必要があります。

たとえば、入力が Android でサポートされている形式 (たとえば、一般的な .mp4 ファイル) である場合、MediaExtractorクラスを使用して各フレームを抽出できます。タイムスタンプは で取得できますgetSampleTime()。連続するフレームのタイムスタンプの差だけレンダリングを遅らせたい場合 -- 最初のフレームのタイムスタンプがゼロになると想定しないでください。

また、ビデオ フレームが一定のレート (たとえば 30fps) で表示されると想定しないでください。一部のソースでは、フレームが不均等に到着します。

Grafika の「ビデオの再生 ( TextureView )」の例、特にSpeedControlCallbackクラスを参照してください。ビデオは、gen-eight-rects.mp4可変フレーム期間を使用してそれを実行します。[60fps で再生] ボックスをオンにすると、プレゼンテーションのタイム スタンプは無視されます。

于 2014-02-05T02:06:12.220 に答える