MediaCodec: MediaFormat 设置 KEY_I_FRAME_INTERVAL 值被忽略

Nia*_*ros 5 mp4 android video-recording android-mediacodec

我在我的项目中使用 MediaCodec 来编码来自相机的视频。由于某些原因,我需要将 KEY_I_FRAME_INTERVAL 设置为 0,这意味着录制的 mp4 视频中的每一帧都将是关键帧(关键帧包含整个图像,而不仅仅是与前一帧的增量差异)。

我在这里遇到了问题:在 nexus 10、nexus 7、小米红米 2、华硕 zenphone 5、galaxy a5 上一切正常。但是 lenovo vibe s1 仅在关键帧间隔等于 1 秒的情况下进行录制。不管 mediaFormat 中设置了什么值,我在 mediaCodec.configure() 中使用的是什么。我试图设置 0、1、5、10,但视频中的关键帧总是每 30 帧。

任何想法如何解决这个问题?

有关更多信息,这是我的 mediaCodec 编码器的设置:

    videoCodec = MediaCodec.createEncoderByType(MIME_VIDEO_CODEC_H264);

    MediaFormat videoFormat = MediaFormat.createVideoFormat(MIME_VIDEO_CODEC_H264, 1280, 720);
    videoFormat.setInteger(MediaFormat.KEY_BIT_RATE, 3800000);
    videoFormat.setInteger(MediaFormat.KEY_FRAME_RATE, 30);
    videoFormat.setInteger(MediaFormat.KEY_COLOR_FORMAT, MediaCodecInfo.CodecCapabilities.COLOR_FormatSurface);
    videoFormat.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 0);
    videoCodec.configure(videoFormat, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
    //using input surface to get input data from camera
    inputSurface = new CodecInputSurface(videoCodec.createInputSurface());
    videoCodec.start();
Run Code Online (Sandbox Code Playgroud)

li *_* hu -2

在将每一帧渲染到编解码器之前,您应该对每一帧使用请求同步。