現在、Android Jelly Bean MediaCodec API を使用して、単純なビデオ プレーヤーを開発しています。
トラックを抽出し、オーディオとビデオを別々のスレッドで再生します。問題は、ビデオ トラックの再生が常に速すぎることです。
問題はどこに隠されていますか?
オーディオとビデオはほぼ同じように扱われますが、オーディオは AudioTrack を介して再生され、ビデオはサーフェスにレンダリングされます。
現在、Android Jelly Bean MediaCodec API を使用して、単純なビデオ プレーヤーを開発しています。
トラックを抽出し、オーディオとビデオを別々のスレッドで再生します。問題は、ビデオ トラックの再生が常に速すぎることです。
問題はどこに隠されていますか?
オーディオとビデオはほぼ同じように扱われますが、オーディオは AudioTrack を介して再生され、ビデオはサーフェスにレンダリングされます。
フレームを最大速度でレンダリングすると、ほとんどのデバイスで 60 fps に達します。エンコーダーによって提供されるプレゼンテーション タイム スタンプに従って、ペースを調整する必要があります。
たとえば、入力が Android でサポートされている形式 (たとえば、一般的な .mp4 ファイル) である場合、MediaExtractorクラスを使用して各フレームを抽出できます。タイムスタンプは で取得できますgetSampleTime()
。連続するフレームのタイムスタンプの差だけレンダリングを遅らせたい場合 -- 最初のフレームのタイムスタンプがゼロになると想定しないでください。
また、ビデオ フレームが一定のレート (たとえば 30fps) で表示されると想定しないでください。一部のソースでは、フレームが不均等に到着します。
Grafika の「ビデオの再生 ( TextureView )」の例、特にSpeedControlCallback
クラスを参照してください。ビデオは、gen-eight-rects.mp4
可変フレーム期間を使用してそれを実行します。[60fps で再生] ボックスをオンにすると、プレゼンテーションのタイム スタンプは無視されます。