MediaExtractor/MediaCodec を使用してビデオをデコードし、TextureView にレンダリングしています。テンプレートとして、 https ://github.com/vecio/MediaCodecDemo/blob/master/src/io/vec/demo/mediacodec/DecodeActivity.java のコードを使用しました。
動画を2倍速で再生したいです。幸いなことに、メディアのエンコード/デコードは十分に高速であるため、MediaCodec ですべてのフレームをデコードし、1 つおきのフレームのみを画面にレンダリングすることでこれを実現できます。ただし、特に任意の値で再生を増やしたい場合は、これは優れた解決策とは思えません。たとえば、10x の速度では、コーデックは 30 fps で 10 フレームごとに再生するのに十分な速さでフレームをデコードできません。
代わりに、MediaExtractor.advance() を複数回呼び出して再生を制御し、デコードする必要のないフレームをスキップしたいと思います。例えば:
...
mDecoder.queueInputBuffer(inIndex, 0, sampleSize, mExtractor.getSampleTime(), 0);
for (i = 0; i < playbackSpeedIncrease; i++) {
mExtractor.advance();
}
...
このコードでは、理論上、エクストラクタはn 番目のフレームごとにのみ抽出する必要があります。ここで、nは変数「playbackSpeedIncrease」によって定義されます。たとえば、n = 5 の場合、これはフレーム 1 ~ 4 を過ぎて進み、フレーム 5 のみを抽出する必要があります。
ただし、これは実際には機能しません。このコードを実行すると、画面にレンダリングされた画像が歪んでいます。
これがなぜなのか誰か知っていますか?任意の速度でビデオを再生するためのより良い方法について何か提案はありますか?