Android MediaCodec在6.0系统上I帧间隔的问题
mMediaCodec = MediaCodec.createByCodecName(debugger.getEncoderName());
MediaFormat mediaFormat = MediaFormat.createVideoFormat("video/avc", mQuality.resX, mQuality.resY);
mediaFormat.setInteger(MediaFormat.KEY_BIT_RATE, mQuality.bitrate);
mediaFormat.setInteger(MediaFormat.KEY_FRAME_RATE, mQuality.framerate);
mediaFormat.setInteger(MediaFormat.KEY_COLOR_FORMAT,MediaCodecInfo.CodecCapabilities.COLOR_FormatSurface);
// mediaFormat.setInteger(MediaFormat.KEY_COLOR_FORMAT,debugger.getEncoderColorFormat());
Log.e("TAG", "COLOR is : " + debugger.getEncoderColorFormat());
mediaFormat.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 5);
mMediaCodec.configure(mediaFormat, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
mMediaCodec.start();
一般mediacodec使用方式如上,但是在6.0系统后使用MediaCodec.createByCodecName(video/avc)
来初始化MediaCodec时,设置MediaFormat.KEY_IFRAME_INTERVAL
参数无效,因为在6.0系统后通过createByCodecName创建的MediaCodec是无法控制的,解决办法。
- 使用
MediaCodec.createEncoderByType("video/type")
测试发现用这种方式创建的MediaCodec设置MediaFormat.KEY_IFRAME_INTERVAL
,是有效的具体原因内为大神知道了可以告诉在下。 - 第二种方式是在MediaCodec出数据时更新帧率,测试有效。
private void updateFrame(){
if (Build.VERSION.SDK_INT >= 23) {
if (System.currentTimeMillis()-timestamp>=1000) {
timestamp=System.currentTimeMillis();
Bundle params = new Bundle();
params.putInt(MediaCodec.PARAMETER_KEY_REQUEST_SYNC_FRAME, 1);
mMediaCodec.setParameters(params);
}
}
}