0x80001001 android runtime_error ai_generated true

android.media.MediaCodec$CodecException: Error 0x80001001: Failed to configure codec (format not supported)

ID: android/mediacodec-format-not-supported

Also available as: JSON · Markdown · 中文
88%Fix Rate
86%Confidence
1Evidence
2023-04-22First Seen

Version Compatibility

VersionStatusIntroducedDeprecatedNotes
Android 11 (API 30) active
Android 12 (API 31) active
Android 13 (API 33) active
MediaCodec API (all versions) active

Root Cause

MediaCodec.configure() is called with a MediaFormat containing unsupported parameters (e.g., resolution, bitrate, or profile) for the selected codec on the device's hardware decoder/encoder.

generic

中文

使用包含设备硬件解码器/编码器不支持的参数(例如分辨率、比特率或配置文件)的MediaFormat调用MediaCodec.configure()。

Official Documentation

https://developer.android.com/reference/android/media/MediaCodec#configure(android.media.MediaFormat,%20android.view.Surface,%20android.media.MediaCrypto,%20int)

Workarounds

  1. 90% success Query codec capabilities using MediaCodecList.getCodecCapabilities() and adjust format parameters (e.g., reduce resolution, change profile). Example: val capabilities = MediaCodecList(MediaCodecList.REGULAR_CODECS).findEncoderForFormat(format); val codecInfo = MediaCodecList.getCodecInfoAt(index); val caps = codecInfo.getCapabilitiesForType(mimeType);
    Query codec capabilities using MediaCodecList.getCodecCapabilities() and adjust format parameters (e.g., reduce resolution, change profile). Example: val capabilities = MediaCodecList(MediaCodecList.REGULAR_CODECS).findEncoderForFormat(format); val codecInfo = MediaCodecList.getCodecInfoAt(index); val caps = codecInfo.getCapabilitiesForType(mimeType);
  2. 85% success Fall back to a software codec by using MediaCodecList with a specific component name that is known to support the format, or use MediaCodec.createDecoderByType() with a fallback to MediaCodec.createByCodecName() using a software decoder name.
    Fall back to a software codec by using MediaCodecList with a specific component name that is known to support the format, or use MediaCodec.createDecoderByType() with a fallback to MediaCodec.createByCodecName() using a software decoder name.

中文步骤

  1. Query codec capabilities using MediaCodecList.getCodecCapabilities() and adjust format parameters (e.g., reduce resolution, change profile). Example: val capabilities = MediaCodecList(MediaCodecList.REGULAR_CODECS).findEncoderForFormat(format); val codecInfo = MediaCodecList.getCodecInfoAt(index); val caps = codecInfo.getCapabilitiesForType(mimeType);
  2. Fall back to a software codec by using MediaCodecList with a specific component name that is known to support the format, or use MediaCodec.createDecoderByType() with a fallback to MediaCodec.createByCodecName() using a software decoder name.

Dead Ends

Common approaches that don't work:

  1. Hardcode a specific codec name like 'video/avc' without checking device support 80% fail

    Different devices support different profiles and levels within a codec. Hardcoding a codec name does not ensure the format parameters are valid.

  2. Use the highest resolution supported by the camera sensor 75% fail

    The encoder may not support that resolution even if the camera does. The codec's capabilities are independent of the camera's.