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

来源:互联网 发布:amf数据分析器下载 编辑:程序博客网 时间:2024/06/08 06:17

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




原创粉丝点击