【问题标题】:Android AudioRecord error starting status -38Android AudioRecord错误启动状态-38
【发布时间】:2018-05-22 16:59:28
【问题描述】:

我在尝试使用音频记录开始录制会话时遇到此错误,似乎音频源很忙,但我找不到有关此错误代码的任何文档或信息。我想做的是

private class AudioRecordRunnable implements Runnable {

    private final AudioRecord mAudioRecord;
    private final AudioDataCallback mAudioDataCallback;

    private byte[] mByteBuffer;
    private final short[] mShortBuffer;
    private final int mByteBufferSize;
    private final int mShortBufferSize;
    private final int mAudioFormat;

    AudioRecordRunnable(int sampleRate, int channelConfig, int audioFormat, int byteBufferSize,
                        @NonNull AudioDataCallback audioDataCallback) {
        mAudioFormat = audioFormat;
        int minBufferSize =
                AudioRecord.getMinBufferSize(sampleRate, channelConfig, mAudioFormat);
        mByteBufferSize = byteBufferSize;
        mShortBufferSize = mByteBufferSize / 2;

        mShortBuffer = new short[mShortBufferSize];
        bufferSize = Math.max(minBufferSize, byteBufferSize);
        mAudioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, sampleRate, channelConfig,
                audioFormat, bufferSize);
        mAudioDataCallback = audioDataCallback;
    }

    @Override
    public void run() {
        if (mAudioRecord.getState() == AudioRecord.STATE_INITIALIZED) {
            try {
                try {
                    mAudioRecord.startRecording();
                } catch (IllegalStateException e) {
                    Log.w(TAG, "startRecording fail: " + e.getMessage());
                    mAudioDataCallback.onError();
                    return;
                }
                while (mIsRecording.get()) {
                    int ret;
                    if (mAudioFormat == AudioFormat.ENCODING_PCM_16BIT) {
                        ret = mAudioRecord.read(mShortBuffer, 0, mShortBufferSize);
                        if (ret > 0) {
                            mByteBuffer = new byte[mByteBufferSize];
                            mAudioDataCallback.onAudioData(
                                    short2byte(mShortBuffer, ret, mByteBuffer), ret * 2);
                        } else {
                            onError(ret);
                            break;
                        }
                    } else {
                        ret = mAudioRecord.read(mByteBuffer, 0, mByteBufferSize);
                        if (ret > 0) {
                            mAudioDataCallback.onAudioData(mByteBuffer, ret);
                        } else {
                            onError(ret);
                            break;
                        }
                    }
                }

            }finally {
                mAudioRecord.stop();
                mAudioRecord.release();
            }
        }
    }


    private byte[] short2byte(short[] sData, int size, byte[] bData) {
        if (size > sData.length || size * 2 > bData.length) {
            Log.w(TAG, "short2byte: too long short data array");
        }
        for (int i = 0; i < size; i++) {
            bData[i * 2] = (byte) (sData[i] & 0x00FF);
            bData[(i * 2) + 1] = (byte) (sData[i] >> 8);
        }
        return bData;
    }

    private void onError(int errorCode) {
        mAudioDataCallback.onError();
        Log.w(TAG, "record fail: " + String.valueOf(errorCode));
        if (errorCode == AudioRecord.ERROR_INVALID_OPERATION) {
            Log.w(TAG, "record fail: ERROR_INVALID_OPERATION");

        } else if (errorCode == AudioRecord.ERROR_BAD_VALUE) {
            Log.w(TAG, "record fail: ERROR_BAD_VALUE");
        }
    }
}

我在 logcat 中收到这条消息

E/AudioRecord: start() 状态 -38

但是没有抛出异常并且结果是 ret = mAudioRecord.read(mShortBuffer, 0, mShortBufferSize);

总是 0

如何避免这个错误?

【问题讨论】:

  • 您是否提供了足够的所需权限?
  • 是的,我提供了正确的权限
  • 您使用什么版本的 api 来编译和运行应用程序?
  • API 27 并在带有 Oreo 的诺基亚 5 上运行
  • 好吧,我想我看到了问题所在,您必须知道,从 api 23 仅​​授予清单文件权限是行不通的。您需要在实际运行时授予它。我在您的代码中看不到任何地方写着requestPermission()onRequestPermissionResult

标签: android audio-recording android-audiorecord


【解决方案1】:

也许,另一个进程正在使用您的麦克风。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多