【问题标题】:Android MediaRecorder error(1, -2147483648)Android MediaRecorder 错误(1, -2147483648)
【发布时间】:2012-10-04 21:12:43
【问题描述】:

我正在使用 MediaRecorder 录制音频并将其保存为带有 AAC 音频的 .mp4。除了搭载 Android 4.1 的 Nexus S 之外,在我尝试过的所有设备上一切正常。在这些设备上,我要么在 start() 上收到错误(1,-2147483648)(我认为),要么继续正常,但输出文件始终为空。我拥有必要的权限,因为该应用程序可以在其他设备上运行。

mRecorder.reset();
mRecorder.setOnErrorListener(new MediaRecorder.OnErrorListener() {

        @Override
        public void onError(MediaRecorder mr, int what, int extra) {
            Log.e("sagasg", what + "   "   + extra);

        }
    });
    mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
    mRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
    mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
    mRecorder.setAudioSamplingRate(SAMPLING_RATE);
    mRecorder.setAudioEncodingBitRate(BIT_RATE);
    mFileName = "unnamed-" + mTimeStarted.year + "-" + mTimeStarted.month + "-" + mTimeStarted.monthDay
            + "-" + mTimeStarted.hour + "-" + mTimeStarted.minute + "-" + mTimeStarted.second;

    mRecorder.setOutputFile(mFilePath + mFileName + mExtension);

    try {
        mRecorder.prepare();
    } catch (IOException e) {
        Log.e(LOG_TAG, "prepare() failed");
    }

    mRecorder.start();

【问题讨论】:

    标签: android android-4.2-jelly-bean android-mediarecorder


    【解决方案1】:

    我通过随机更改设置解决了这个问题。当我删除它时它开始工作了

    mRecorder.setAudioSamplingRate(SAMPLING_RATE);
    

    采样率在哪里

    public static final int SAMPLING_RATE = 48000;
    

    根据文档,AAC 支持 8-48 kHz,但由于某种原因它不支持。现在我只需要修复另一个只出现在 Nexus S 上的错误。现在我明白为什么开发人员更喜欢 iOS。

    编辑:现在它不会因为这个选项而崩溃,只是录音是一个空文件。尝试了其他值,例如 24000。结果相同。我必须坚持使用默认采样率。

    【讨论】:

      【解决方案2】:

      这些错误很难调试,但我认为这样就可以解决问题。

      这是我建议您更改的行:

      mRecorder.setOutputFile(mFilePath + mFileName + mExtension);
      

      您应该使用FileInputStream:

      FileInputStream inputStream = new FileInputStream(mFilePath + mFileName + mExtension);
      mRecorder.setDataSource(inputStream.getFD());
      

      或者你也可以试试FileOutputStream

      FileOutputStream outputStream = new FileOutputStream(mFilePath + mFileName + mExtension);
      mRecorder.setOutputFile(outputStream.getFD());
      

      请注意,对于这些解决方案中的任何一个,您可能必须捕获 IllegalArgumentExceptionSecurityExceptionIllegalStateExceptionIOException 中的一个或多个。

      【讨论】:

      • FileOutputStream 给出了相同的结果。好吧,我不知道它是否完全相同,因为我这里没有 Nexus,但它可以在我的手机上运行并在 Nexus S 上崩溃。
      猜你喜欢
      • 2012-07-17
      • 2015-09-18
      • 1970-01-01
      • 1970-01-01
      • 2013-09-20
      • 2016-07-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多