Android MediaCodec:编码时如何请求关键帧

use*_*818 3 encode android-4.2-jelly-bean

在Android4.1中,经常在实时编码应用程序中请求关键帧。但是如何使用MediaCodec对象呢?当前的Android4.2 SDK似乎不支持它。

小智 5

可以通过排队输入缓冲器时指定MediaCodec.BUFFER_FLAG_SYNC_FRAME产生随机关键帧:

MediaCodec codec = MediaCodec.createDecoderByType(type);
codec.configure(format, ...);
codec.start();
ByteBuffer[] inputBuffers = codec.getInputBuffers();
for (;;) {
  int inputBufferIndex = codec.dequeueInputBuffer(timeoutUs);
  if (inputBufferIndex >= 0) {
    // fill inputBuffers[inputBufferIndex] with valid data
    ...
    codec.queueInputBuffer(inputBufferIndex, 0, inputBuffers[inputBufferIndex].limit(), presentationTime,
        isKeyFrame ? MediaCodec.BUFFER_FLAG_SYNC_FRAME : 0);
  }

}
Run Code Online (Sandbox Code Playgroud)

偶然发现在Galaxy Nexus上编码视频时需要插入随机关键帧。在它上面,MediaCodec并没有在视频开始时自动生成关键帧。