Я использую MediaExtractor/MediaCodec для декодирования видео и рендеринга его в TextureView. В качестве шаблона я использовал код из: https://github.com/vecio/MediaCodecDemo/blob/master/src/io/vec/demo/mediacodec/DecodeActivity.java
Я хотел бы иметь возможность воспроизводить видео на скорости 2x. К счастью, кодирование/декодирование мультимедиа выполняется достаточно быстро, поэтому я могу добиться этого, позволив MediaCodec декодировать каждый кадр, а затем отображать на экране только каждый второй кадр. Однако это не похоже на отличное решение, особенно если вы хотите увеличить воспроизведение на произвольное значение. Например, при 10-кратной скорости кодек не может декодировать кадры достаточно быстро, чтобы воспроизводить каждый 10-й кадр со скоростью 30 кадров в секунду.
Поэтому вместо этого я хотел бы управлять воспроизведением, вызывая 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.
Однако на практике это не работает. Когда я запускаю этот код, изображение, отображаемое на экране, искажается:
Кто-нибудь знает, почему это так? Любые предложения по улучшению способов воспроизведения видео с произвольным увеличением скорости?