【问题标题】:Illegal State Exception when calling MediaCodec.configure()调用 MediaCodec.configure() 时出现非法状态异常
【发布时间】:2014-02-12 15:01:05
【问题描述】:

我在 MediaCodec.configure() 行上收到 IllegalStateException,我正在尝试使用 MediaCodec 录制音频。这只发生在某些手机上,在标签上一切都很好。这个特殊的崩溃示例来自三星 Galaxy S4。 异常痕迹:

01-22 17:33:38.379: V/ACodec(16541): [OMX.google.aac.decoder] Now Loaded
01-22 17:33:38.379: V/ACodec(16541): onConfigureComponent
01-22 17:33:38.379: W/ACodec(16541): [OMX.google.aac.decoder] Failed to set standard component role 'audio_encoder.aac'.
01-22 17:33:38.379: E/ACodec(16541): [OMX.google.aac.decoder] configureCodec returning error -2147483648
01-22 17:33:38.379: E/MediaCodec(16541): Codec reported an error. (omx error 0x80001001, internalError -2147483648)
01-22 17:33:38.384: D/AndroidRuntime(16541): Shutting down VM
01-22 17:33:38.384: W/dalvikvm(16541): threadid=1: thread exiting with uncaught exception (group=0x418d0700)
01-22 17:33:38.414: W/BugSenseHandler(16541): Transmitting crash Exception Unable to resolve host "bugsense.appspot.com": No address associated with hostname
01-22 17:33:41.404: E/AndroidRuntime(16541): FATAL EXCEPTION: main
01-22 17:33:41.404: E/AndroidRuntime(16541): java.lang.IllegalStateException
01-22 17:33:41.404: E/AndroidRuntime(16541):    at android.media.MediaCodec.native_configure(Native Method)
01-22 17:33:41.404: E/AndroidRuntime(16541):    at android.media.MediaCodec.configure(MediaCodec.java:259)
01-22 17:33:41.404: E/AndroidRuntime(16541):    at com.example.poc.MyRenderer.startRecordPressed(MyRenderer.java:344)

音频格式声明:

    MediaFormat format = new MediaFormat();
    format.setString(MediaFormat.KEY_MIME, "audio/mp4a-latm");
    format.setInteger(MediaFormat.KEY_AAC_PROFILE, MediaCodecInfo.CodecProfileLevel.AACObjectLC);
    format.setInteger(MediaFormat.KEY_SAMPLE_RATE, 44100);
    format.setInteger(MediaFormat.KEY_CHANNEL_COUNT, 1);
    format.setInteger(MediaFormat.KEY_BIT_RATE, 64000);

音频编码器初始化:

        mAudioEncoder = MediaCodec.createEncoderByType("audio/mp4a-latm");
        mAudioEncoder.configure(mAudioFormat, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE); //<-This line fails
        mAudioEncoder.start();

有人知道那可能是什么吗?奇怪的是,它只发生在某些设备上。 欢迎提出任何建议!

【问题讨论】:

  • 设置看起来不错。关于你的代码的一件奇怪的事情是你声明了一个本地的MediaFormat format,但后来你似乎使用了一个成员变量mAudioEncoder。您能否确认使用了正确的格式?也许在调用configure()之前记录mAudioFormat的值。
  • 这只是一个摘录,mAudioFormat 初始化很好,我仔细检查了。你知道问题可能是什么吗?以及如何进一步调试?
  • CTS EncoderTest 完成您的代码所做的工作,因此它绝对可以在所有设备上运行。您可以将MediaFormat 日志的输出添加到您的问题中吗?奇怪的是,编码器的故障来自OMX.google.aac.decoder,但也许这很正常。 (我在音频方面的工作不多。)
  • @fadden,同样,我在尝试为 video/avc 配置编码器时收到了来自 decoder component 的错误
  • @fadded,我如何从 MediaFormat 收集日志?

标签: android audio-recording codec android-mediacodec


【解决方案1】:

尝试在某些运行 Jellybean (4.1.2) 的三星设备上配置视频编解码器时,我看到了同样的错误。在许多情况下,在格式参数中将 KEY_MAX_INPUT_SIZE 设置为 0(在调用 configure 之前)将解决它:

mVideoFormat.setInteger(MediaFormat.KEY_MAX_INPUT_SIZE, 0);

我在研究一个类似的错误 (https://stackoverflow.com/questions/15105843/mediacodec-jelly-bean#=) 时发现了这个解决方案,并且对它修复了多少编解码器配置错误感到惊讶。也就是说,我没有在音频编解码器上尝试过,所以不能保证它会在你的情况下工作:/

【讨论】:

  • KEY_MAX_INPUT_SIZE 设置为 0 时会发生什么?我找不到任何文档
  • 与瑞芯微视频解码器相同的问题,将其设置为 0 即可解决。
  • 这也解决了带有 Android 4.3 的 Galaxy Nexus 的问题(使用 ExoPlayer 演示应用播放一些视频会导致崩溃)。你知道这个错误仅限于哪种软件/硬件吗?
猜你喜欢
  • 1970-01-01
  • 2013-11-15
  • 1970-01-01
  • 2013-02-06
  • 1970-01-01
  • 2012-06-07
  • 1970-01-01
  • 2011-09-25
  • 1970-01-01
相关资源
最近更新 更多