android中MediaCodec硬编码中关键帧间隔时间设置问题

在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();
设置KEY_I_FRAME_INTERVAL为1秒,但查看输出中发现,时间间隔很长,我的华为mate9时间间隔为36秒的时间。
不知道为什么。。。。。。。。。。。。。。

在一篇文章中《无法控制MediaCodec输出关键帧解决方案》地址为:http://www.jianshu.com/p/175d1e4ffaad中提到
“使用MediaCodec.createInputSurface()方法获取输入Surface,再通过Opengl渲染后喂给MediaCodec才能真正控制关键帧的数量”
但改用这种方法后,还是无法控制关键帧间隔。
还是不知道为什么。。。。。。。。。。。。。。。。。。

在看EaysPusher程序源码中发现,它的解决方案是:
在获取到编码器输出数据后,每隔1秒的时间设置参数请求

if (System.currentTimeMillis() - timeStamp >= 1000) {//1000毫秒后,设置参数
	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);
	}
}


 
  

 
  

你可能感兴趣的:(android中MediaCodec硬编码中关键帧间隔时间设置问题)