【发布时间】: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