我正在使用MediaExtractor/MediaCodec解码视频并将其渲染为TextureView.作为模板,我使用了以下代码:https://github.com/vecio/MediaCodecDemo/blob/master/src/io/vec/demo/mediacodec/DecodeActivity.java
我希望能够以2倍的速度播放视频.幸运的是,媒体编码/解码速度足够快,因此我可以通过让MediaCodec每帧解码,然后只将每隔一帧渲染到屏幕来实现这一点.然而,这并不是一个很好的解决方案,特别是如果你想以任意值增加播放.例如,在10倍速度下,编解码器无法足够快地解码帧以每30帧以每秒10帧的速度播放.
因此,我希望通过多次调用MediaExtractor.advance()来控制播放,以跳过不需要解码的帧.例如:
...
mDecoder.queueInputBuffer(inIndex, 0, sampleSize, mExtractor.getSampleTime(), 0);
for (i = 0; i < playbackSpeedIncrease; i++) {
mExtractor.advance();
}
...
Run Code Online (Sandbox Code Playgroud)
使用此代码,理论上提取器应仅提取每第n帧,其中n由变量'playbackSpeedIncrease'定义.例如,如果n = 5,则应该超过帧1-4并且仅提取帧5.
但是,这在实践中不起作用.当我运行此代码时,渲染到屏幕的图像会失真:
有人知道为什么吗?有关更好的方式以任意速度播放视频的任何建议都会增加吗?