在MediaCodec硬编码中设置I关键帧时间间隔,在API中是这么设置的
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,debugger.getEncoderColorFormat());
mediaFormat.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 1);//设置1秒的时间,不成功
mediaFormat.setInteger("profile", 8); // Profile HIGH //好像也不行
mediaFormat.setInteger("level", 0x200); // Level 3.1 //好像也不行
mMediaCodec.configure(mediaFormat, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
mMediaCodec.start();
if (System.currentTimeMillis() - timeStamp >= 1000) {//1000毫秒后,设置参数设置KEY_I_FRAME_INTERVAL为1秒,但查看输出中发现,时间间隔很长,我的华为mate9时间间隔为36秒的时间。 不知道为什么。。。。。。。。。。。。。。 在一篇文章中《无法控制MediaCodec输出关键帧解决方案》地址为:http://www.jianshu.com/p/175d1e4ffaad中提到 “使用MediaCodec.createInputSurface()方法获取输入Surface,再通过Opengl渲染后喂给MediaCodec才能真正控制关键帧的数量” 但改用这种方法后,还是无法控制关键帧间隔。 还是不知道为什么。。。。。。。。。。。。。。。。。。 在看EaysPusher程序源码中发现,它的解决方案是: 在获取到编码器输出数据后,每隔1秒的时间设置参数请求
timeStamp = System.currentTimeMillis(); if (Build.VERSION.SDK_INT >= 23) { Bundle params = new Bundle(); params.putInt(MediaCodec.PARAMETER_KEY_REQUEST_SYNC_FRAME, 0); mMediaCodec.setParameters(params); } }