工具/软件:
您好、
当我使用 mediacodec 编码图像时、出现错误
2025年03月15日 08:15:40.474 CocodeBufferChannel com.css.testvid D [C2.v4l2.avc.encoder#742]创建了带有分配器 ID 的输入块池 23 => poolID 18 - OK (0)
2025年03月15日 08:15:40.482 CCodecBufferChannel com.css.testvid i [C2.v4l2.avc.encoder#742]创建了带有分配器 ID 的输出块池 23 => poolID 17 - OK
2025年03月15日 08:15:40.483 CocodeBufferChannel com.css.testvid D [C2.v4l2.avc.encoder#742]已配置输出块池 ID 17 =>确定
2025年03月15日 08:15:40.484 CCodecBuffers com.css.testvid D 获取图形块失败:14
2025年03月15日 08:15:40.484 CCodecBufferChannel com.css.testvid W [C2.v4l2.avc.encoder#742] start:根本无法分配内存
2025年03月15日 08:15:40.484 编解码器 com.css.testvid E 输入缓冲区的初始准备失败
2025年03月15日 08:15:40.484 MediaCodec com.css.testvid E 编解码器报告错误 0xfffffff4/no_memory、actionCode 0、处于状态 5/启动时
我的 Android 版本: am62p-userdebug 15 AP4A.250105.002.A1 eng.root test-keys
bellow 是我的代码,它可以在其他设备上工作。
字符串 MimeType = MediaFormat.MimeType_VIDEO_AVC;
MediaCodecList codecList =新的 MediaCodecList(MediaCodecList.ormal_codecs);
MediaFormat 格式= MediaFormat.createVideoFormat(MimeType,1,280,720);
字符串编码 CodecName = codecList.findEncoderForFormat (format);
请尝试{
MediaCodec 编码器= MediaCodec.createByCodecName (encodeCodecName);
// Log.i(“testEncode",“,"codece、"codece info“ info:\n“+ MediaCodecInfoToString (encoder.getCodecInfo ()));
整型颜色格式= 0;
MediaCodecInfo.CodecCapabilities = encoder.getCodecInfo().getCapabilitiesForType(MimeType);
对于 (int i = 0;i < Capabilities.colorFormats.length /*&& colorFormat == 0*/;i++){
Int fmt = Capabilities.colorFormats[i];
开关 (fmt){
CASE MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420Planar:
CASE MediaCodecInfo.codecCapability.COLOR_FormatYUV420PackedPlanar:
CASE MediaCodecInfo.codecCapabilities.COLOR_FormatYUV420SemiPlanar:
CASE MediaCodecInfo.codecCapability.COLOR_FormatYUV420PackedSemiPlanar:
CASE MediaCodecInfo.CodecCapability.COLOR_TI_FormatYUV420PackedSemiPlanar:
if (colorFormat == 0)
颜色格式= fmt;
休息;
默认值:
休息;
}
}
if (colorFormat=0)
{
log.e(“testEncode",“,"no、"no supported“ supported color format“);
返回;
}
format.setInteger(MediaFormat.KEY_COLOR_FORMAT,颜色格式);
format.setInteger(MediaFormat.KEY_BIT_RATE,1024000 );
format.setInteger(MediaFormat.KEY_FRAME_RATE、15);
// format.setInteger(MediaFormat.KEY_BITRATE_MODE、bitrate_mode_VBR);
format.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL、5);
ENCODER.CONFIGURE(格式,null、null、MediaCodec。configure_flag_encode);
ENCODER.START ();
} catch(例外 e){
e.printStackTrace();
}