Android MediaCodec在6.0系统上I帧间隔的问题

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是无法控制的,解决办法。

  1. 使用MediaCodec.createEncoderByType("video/type")测试发现用这种方式创建的MediaCodec设置MediaFormat.KEY_IFRAME_INTERVAL,是有效的具体原因内为大神知道了可以告诉在下。
  2. 第二种方式是在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);
            }
        }
    }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值