Android AudioRecord读取总是返回-3(ERROR_INVALID_OPERATION)

我试图简化代码到最低限度,它仍然无法正常工作:

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无论如何。 我错过了什么?

  • AudioFlinger无法创buildlogging轨迹,状态:-1,需要帮助ifx
  • AudioRecord和AudioTrack延迟
  • 使用Android SDK从原始PCM数据创buildWAV文件
  • PCM - > AAC(编码器) - > PCM(解码器)实时进行正确的优化
  • AudioFlinger无法创建记录轨道,状态:-1,需要帮助ifx
  • 将PCM录制的数据写入.wav文件(java android)
  • 在Android上使用AudioRecord和MediaCodec编码AAC音频
  • Android中的实时音频录制和播放以及线程和回调处理
  • 与我的朋友一起,我们终于设法解决了这个问题。 在调用read()之前,您需要调用AudioRecord.startRecording()。 完成之后,您应该调用AudioRecord.stop()。 我想知道为什么很难find这个基本的信息

    你有没有检查清单中的权限?

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

    文档说:

    从audio硬件中读取audio数据以logging到字节数组中。 AudioRecord构造函数中指定的格式应该是ENCODING_PCM_8BIT以对应于数组中的数据。

    参数

    audioData byte:写入录制audio数据的数组。 该值不能为空。

    offsetInBytes int:写入数据的audioData中的索引,以字节表示。

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

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

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

    我想你应该检查AudioRecord对象的初始化。 所以看看这个答案: Android AudioRecord的例子

    根据Android文档 –

    -3表示这是一个无效的操作 。

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

    常量值:-3(0xfffffffd)

    这个问题很可能是因为它不能用你指定的参数创build一个AudioRecord实例。

    在创build对象之后,尝试通过getState方法检查它是否被正确初始化

      if (rec.getState() == AudioRecord.STATE_UNINITIALIZED) { // Oops looks like it was not initalized correctly } 

    如果确实是未初始化的状态,则尝试设置不同的audio属性。 检查AudioRecord [构造函数]( https://developer.android.com/reference/android/media/AudioRecord.html#AudioRecord (int,int,int,int))的文档,文档提供了关于如何初始化不同的参数。