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());

これらのソリューションのいずれについても、、、、、およびの1つ以上をキャッチする必要がある場合があることに注意しIllegalArgumentExceptionSecurityExceptionください。IllegalStateExceptionIOException

于 2012-10-04T21:38:31.970 に答える