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);
	}
}






评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值