Android Kotlin中MediaCodec配置失败求助(错误码0xffffffea/BAD_VALUE)
Android MediaCodec AVC编码器配置失败(BAD_VALUE错误)
错误原因分析
报错0xffffffea/BAD_VALUE说明你配置的MediaFormat缺少编码器必需的核心参数,或者传入的参数不符合编码器要求。你的代码仅指定了视频MIME类型、宽高,未设置比特率、帧率、颜色格式等编码器强制要求的参数,同时还可能存在previewView宽高未初始化(值为0)的问题。
解决方案
1. 确保获取有效的视频分辨率
previewView未完成布局测量时,宽高可能为0,需先获取有效尺寸:
- 可通过
ViewTreeObserver监听布局完成事件,获取实际测量后的宽高 - 或临时使用编码器支持的标准分辨率(如1280x720、1920x1080)
2. 完善MediaFormat的必需参数
AVC编码器要求MediaFormat必须包含以下核心参数:
- 比特率(KEY_BIT_RATE):控制视频质量,根据分辨率调整,如1280x720建议设为2Mbps
- 帧率(KEY_FRAME_RATE):通常设置为30fps
- 关键帧间隔(KEY_I_FRAME_INTERVAL):一般设为帧率的2倍
- 颜色格式(KEY_COLOR_FORMAT):根据输入方式选择,Surface输入需指定
COLOR_FormatSurface
修正后的代码示例
// 处理previewView宽高未初始化的情况, fallback到标准分辨率 val targetWidth = if (previewView.width == 0) 1280 else previewView.width val targetHeight = if (previewView.height == 0) 720 else previewView.height // 确保分辨率为偶数(多数编码器不支持奇数尺寸) val adjustedWidth = if (targetWidth % 2 != 0) targetWidth - 1 else targetWidth val adjustedHeight = if (targetHeight % 2 != 0) targetHeight - 1 else targetHeight val videoEncoder = MediaCodec.createEncoderByType(MediaFormat.MIMETYPE_VIDEO_AVC) val videoFormat = MediaFormat.createVideoFormat( MediaFormat.MIMETYPE_VIDEO_AVC, adjustedWidth, adjustedHeight ).apply { // 设置比特率(2Mbps) setInteger(MediaFormat.KEY_BIT_RATE, 2 * 1024 * 1024) // 设置帧率30fps setInteger(MediaFormat.KEY_FRAME_RATE, 30) // 关键帧间隔60帧(每2秒一个关键帧) setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 2) // 指定Surface输入的颜色格式 setInteger(MediaFormat.KEY_COLOR_FORMAT, MediaCodecInfo.CodecCapabilities.COLOR_FormatSurface) } videoEncoder.configure( videoFormat, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE ) videoEncoder.start()
额外注意事项
- 如果使用ByteBuffer作为输入源,需查询编码器支持的颜色格式,不能直接使用
COLOR_FormatSurface - 不同设备的编码器支持的参数范围可能不同,建议通过
MediaCodecInfo查询当前设备编码器的具体能力 - 分辨率必须为偶数,否则多数编码器会拒绝配置
内容的提问来源于stack exchange,提问作者Jalalkun
相关产品推荐
相关产品推荐

