2

我正在使用 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();
4

2 回答 2

4

我已经通过对设置进行随机更改来解决它。当我删除它开始工作

mRecorder.setAudioSamplingRate(SAMPLING_RATE);

采样率在哪里

public static final int SAMPLING_RATE = 48000;

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

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

于 2012-10-05T20:08:18.017 回答
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());

请注意,对于这些解决方案中的任何一个,您可能必须捕获 、 、 和 中的IllegalArgumentException一个SecurityExceptionIllegalStateException多个IOException

于 2012-10-04T21:38:31.970 回答