Android端MediaRecorder仅录IFrame求助:无法修改VIDEO_IFRAME_INTERVAL
解决方案
你的核心问题是误用了MediaRecorder.metrics——这个API是只读的录制指标统计工具,用来获取录制过程中的帧数据、码率等统计信息,根本无法用来配置录制参数,所以修改它的副本不会对录制行为产生任何影响。
要录制全I帧的HEVC视频,需要通过MediaRecorder的参数配置接口来设置,具体步骤如下:
1. 正确设置I帧间隔参数
Android平台上,针对MediaRecorder配置全I帧,需要使用setParameters()方法传入编码器参数,或者通过MediaFormat配置。以下是两种可行方案:
方案一:使用setParameters()直接配置
部分硬件编码器支持通过key-intra-period参数设置关键帧间隔,设为0或1即可强制全I帧:
// 在MediaRecorder完成基础配置(setOutputFormat、setVideoEncoder等)之后调用 val params = Bundle() // 0表示无间隔(全I帧),部分编码器可能需要设为1(每1帧一个I帧) params.putInt("key-intra-period", 0) mRecorder.setParameters(params)
方案二:通过MediaFormat配置(推荐)
如果使用MediaFormat初始化录制参数,可以直接在格式中指定KEY_I_FRAME_INTERVAL为0:
val videoWidth = 1920 val videoHeight = 1080 val frameRate = 30 val format = MediaFormat.createVideoFormat(MediaFormat.MIMETYPE_VIDEO_HEVC, videoWidth, videoHeight) format.setInteger(MediaFormat.KEY_FRAME_RATE, frameRate) format.setInteger(MediaFormat.KEY_BIT_RATE, 15_000_000) // 根据需求调整码率 format.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 0) // 强制全I帧 // 将配置应用到MediaRecorder mRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4) mRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.HEVC) mRecorder.setVideoSize(videoWidth, videoHeight) mRecorder.setVideoFrameRate(frameRate) // API 26及以上可直接设置MediaFormat // mRecorder.setVideoFormat(format)
2. 注意事项
- 部分硬件编码器可能不支持
KEY_I_FRAME_INTERVAL=0,此时可以尝试将值设为1(表示每1帧生成一个I帧),效果等同于全I帧。 - 所有参数配置必须在调用
mRecorder.prepare()之前完成,否则设置不会生效。 - 全I帧视频的码率会显著高于普通视频,需要根据设备性能和存储情况调整码率参数。
内容的提问来源于stack exchange,提问作者Nimmi Mathew
相关产品推荐
相关产品推荐

