Я использую MediaExtractor/MediaCodec для декодирования видео и рендеринга его в TextureView. В качестве шаблона я использовал код от: https://github.com/vecio/MediaCodecDemo/blob/master/src/io/vec/demo/mediacodec/DecodeActivity.javaПропустить кадры при воспроизведении видео с помощью MediaExtractor и MediaCodec
Я хотел был бы иметь возможность воспроизвести видео на скорости 2x. К счастью, кодирование/декодирование носителей достаточно быстро, поэтому я могу это сделать, разрешив MediaCodec декодировать каждый кадр, а затем отображать только каждый кадр на экран. Однако это не похоже на отличное решение, особенно если вы хотите увеличить воспроизведение на произвольное значение. Например, при скоростях 10x кодек не способен декодировать кадры достаточно быстро, чтобы воспроизводить каждый 10-й кадр со скоростью 30 кадров в секунду.
Так что я бы хотел контролировать воспроизведение, несколько раз перезывая MediaExtractor.advance(), чтобы пропускать кадры, которые не нужно декодировать. Например:
...
mDecoder.queueInputBuffer(inIndex, 0, sampleSize, mExtractor.getSampleTime(), 0);
for (i = 0; i < playbackSpeedIncrease; i++) {
mExtractor.advance();
}
...
С помощью этого кода, в теории экстрактор должен извлечь только каждый энный кадр, где п определяется переменной «playbackSpeedIncrease». Например, если n = 5, это должно продвигать предыдущие кадры 1-4 и извлекать только рамку 5.
Однако это не работает на практике. Когда я запускаю этот код, изображение, отображаемое на экране, искажается:
Кто-нибудь знает, почему это так? Любые предложения по лучшим способам воспроизведения видео с произвольной скоростью увеличиваются?