小编Tim*_*Tim的帖子

使用MediaExtractor和MediaCodec在视频播放中跳过帧

我正在使用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.

但是,这在实践中不起作用.当我运行此代码时,渲染到屏幕的图像会失真:在此输入图像描述

有人知道为什么吗?有关更好的方式以任意速度播放视频的任何建议都会增加吗?

java video android mediacodec mediaextractor

3
推荐指数
1
解决办法
1593
查看次数

标签 统计

android ×1

java ×1

mediacodec ×1

mediaextractor ×1

video ×1