You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 18:40:37