我已经尝试将代码简化为最低限度,但它仍然无效:
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。 我错过了什么?
我和朋友一起终于设法解决了这个问题。 您需要在调用read()之前调用AudioRecord.startRecording()。 完成后,您应该调用AudioRecord.stop()。 我想知道为什么find这个基本的信息是如此困难
你检查过清单中的权限了吗?
文件说:
从音频硬件读取音频数据以便记录到字节数组中。 AudioRecord构造函数中指定的格式应为ENCODING_PCM_8BIT,以对应于数组中的数据。
参数
audioData byte:写入录制的音频数据的数组。 该值绝不能为空。
offsetInBytes int:audioData中的索引,以字节为单位写入数据。
sizeInBytes int:请求的字节数。 返回
int零或读取的正字节数,或以下错误代码之一。 字节数不会超过sizeInBytes。
如果对象未正确初始化,则为ERROR_INVALID_OPERATION
我认为你应该检查AudioRecord对象的初始化。 所以看看这个答案: Android AudioRecord示例
根据Android文档 –
-3表示它是无效操作 。
表示由于不正确使用方法而导致的故障。
常数值:-3(0xfffffffd)
此问题很可能是因为它无法使用您指定的参数创建AudioRecord
实例。
创建对象后,尝试通过方法getState
检查它是否已正确初始化
if (rec.getState() == AudioRecord.STATE_UNINITIALIZED) { // Oops looks like it was not initalized correctly }
如果状态确实未初始化,则尝试设置不同的音频属性。 查看AudioRecord
[constructor]( https://developer.android.com/reference/android/media/AudioRecord.html#AudioRecord (int,int,int,int,int))的文档,该文档提供了有关的详细信息。如何初始化不同的参数。