android - 调用 MediaCodec.configure() 时出现非法状态异常

标签 android audio-recording codec android-mediacodec

我在 MediaCodec.configure() 行收到 IllegalStateException,我正在尝试使用 MediaCodec 录制音频。这只发生在某些手机上,在选项卡上一切都很好。这个特殊的崩溃示例来自 Samsung 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();

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

最佳答案

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

mVideoFormat.setInteger(MediaFormat.KEY_MAX_INPUT_SIZE, 0);

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

关于android - 调用 MediaCodec.configure() 时出现非法状态异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21284874/

相关文章:

Android SQLite 事务和多线程

android - 如何在没有商家帐户的情况下使用 Braintree 进行买卖双方付款?

android - 如何使用 CC41-A HM10 BLE 作为主机来检测 Android 手机或 iPhone 作为从机?

flutter - 如何在 flutter 中将音频字节转换为字符串

javascript - 在浏览器中对 HTML5 视频标签进行 RTSP 转码

android - 什么时候调用Application类的getApplicationContext()?

ios - 如何绘制语音样本的语调?

python - 将语音数据作为字符串记录和写入文件中以进行加密

audio - 使用 mp4box 从 .mp4 中解复用音轨

python - Unicode解码错误: 'ascii' codec can't decode byte 0x8b