Android AudioRecord read总是返回-3(ERROR_INVALID_OPERATION)

时间:2017-06-17 11:02:13

标签: java android audiorecord

我已经尝试将代码简化为最低限度,但仍然无效:

public class MainActivity extends AppCompatActivity {

AudioRecord rec;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    rec=  new AudioRecord(MediaRecorder.AudioSource.MIC,44100, AudioFormat.CHANNEL_IN_MONO,AudioFormat.ENCODING_PCM_16BIT,8192);

    short buff[] = new short[8192];
    int read = rec.read(buff,0,buff.length);
    System.out.print(read);
}

无论如何,始终返回-3。我错过了什么?

3 个答案:

答案 0 :(得分:7)

我和朋友一起设法解决了这个问题。您需要在调用read()之前调用AudioRecord.startRecording()。完成后,您应该调用AudioRecord.stop()。我想知道为什么要找到这条基本信息是如此困难

答案 1 :(得分:3)

您是否检查过清单中的权限?

</application>

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

文档说:

从音频硬件读取音频数据以便记录到字节数组中。 AudioRecord构造函数中指定的格式应为ENCODING_PCM_8BIT,以对应于数组中的数据。

<强> 参数

audioData byte:写入录制的音频数据的阵列。 该值绝不能为空。

offsetInBytes int:用于写入数据的audioData中的索引,以字节为单位。

sizeInBytes int:请求的字节数。 返回

int零或读取的正字节数,或以下错误代码之一。字节数不会超过sizeInBytes。

如果对象未正确初始化,则

ERROR_INVALID_OPERATION

我认为你应该检查AudioRecord对象的初始化。 所以看看这个答案:Android AudioRecord example

答案 2 :(得分:2)

根据Android文档 -

-3表示它是release notes

  

表示由于不正确使用方法而导致的失败。

     

常数值:-3(0xfffffffd)

这个问题很可能是因为它无法使用您指定的参数创建AudioRecord实例。

创建对象后,尝试通过方法getState

检查它是否已正确初始化
    if (rec.getState() == AudioRecord.STATE_UNINITIALIZED) {
        // Oops looks like it was not initalized correctly
    }

如果状态确实未初始化,请尝试设置不同的音频属性。查看AudioRecord [constructor](invalid operation,int,int,int,int)的文档,该文档提供了有关如何初始化不同参数的全面详细信息。