java - Android AudioRecord 的问题

标签 java android android-activity android-manifest


private static final int SampleRate = 8000; 
private static final int Channels = AudioFormat.CHANNEL_IN_MONO;
private static final int Encoding = AudioFormat.ENCODING_PCM_16BIT;

private void startRecording(){
    int bufferSize = AudioRecord.getMinBufferSize(SampleRate, Channels,  AudioFormat.ENCODING_PCM_16BIT);
       if (bufferSize > 0) {
            recorder = new AudioRecord(MediaRecorder.AudioSource.MIC, SampleRate, Channels, Encoding, BufferElements2Rec*BytesPerElement);
            recorder.startRecording();
            isRecording = true;
            recordingThread = new Thread(new Runnable(){
                public void run(){
                    writeAudioDataToFile();
                }
            },"AudioRecorder Thread");
            recordingThread.start();
       }
}

这适用于设备模拟器,我在那里有任何问题,但在真正的手机中不起作用。我收到此错误:

java.lang.IllegalStateException: startRecording() called on an unitialized AudioRecord.

我放入 list :

<uses-permission android:name="android.permission.RECORD_AUDIO"/>

最佳答案

作为documentation对于 AudioRecord 构造函数来说,

you should call getState() immediately after construction to confirm that the object is usable.

可能的状态是:

STATE_INITIALIZED

STATE_UNINITIALIZED

在您的情况下,记录器未正确初始化,因此在调用 startRecording() 时您会收到 IllegarArgumentException。

原因之一可能是您的 SampleRate,即 8000。根据文档,44100Hz 是保证在所有设备上工作的唯一速率,因此请先尝试使用此速率(此外,文档没有明确说明 8000HZ作为有效率)。

然后在您的代码中,将 SampleRate 更改为 44100 并检查对象状态,例如:

private static final int SampleRate = 44100;

及以后:

recorder = new AudioRecord(MediaRecorder.AudioSource.MIC, SampleRate, Channels, Encoding, BufferElements2Rec*BytesPerElement);

if (recorder.getState() == AudioRecord.STATE_INITIALIZED) {
    recorder.startRecording();
    isRecording = true;
    //rest of the code
}
else {
    //not initialized properly
}

关于java - Android AudioRecord 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27878458/

相关文章:

android - LimitLine 旁边的 mpandroidchart 注释?

java - 如何在 TextView 中使用 ClickableSpans 并且仍然能够水平滚动?

android - Dialog Activity 还会在后台恢复其他 Activity

android - 如何防止双击刷新按钮

java - Android - WebView向下滚动时刷新

java - 在 Eclipse 4.4 RCP 构建中, "The service Plugin converter could not be acquired."

java - 如何在 Eclipse 中运行简单的 JUnit 测试

java - 缩小类型转换 : Why is assignment of int to a byte in a declaration allowed?

android - Grid View Pager 中的 ScrollView 不适用于 Android Wear

java - 将字符串拆分为矩阵或表格并存储到 ArrayList 中