Android AudioRecord 始终读取 returns -3 (ERROR_INVALID_OPERATION)
Android AudioRecord read always returns -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);
}
总是returns -3 无论如何。我错过了什么?
您检查清单中的权限了吗?
</application>
<uses-permission android:name="android.permission.RECORD_AUDIO" />
文档说:
从音频硬件读取音频数据以记录到字节数组中。 AudioRecord构造函数中指定的格式应该是ENCODING_PCM_8BIT来对应数组中的数据
参数
audioData字节:写入录制音频数据的数组。
此值绝不能为空。
offsetInBytes int:写入数据的 audioData 中的索引,以字节表示。
sizeInBytes int:请求的字节数。
Returns
int 零或已读取的正字节数,或以下错误代码之一。字节数不会超过sizeInBytes.
ERROR_INVALID_OPERATION 如果对象没有正确初始化
我认为您应该检查 AudioRecord 对象的初始化。
所以看看这个答案:Android AudioRecord example
根据 Android 文档 -
-3表示是一个invalid operation.
Denotes a failure due to the improper use of a method.
Constant Value: -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) 的文档,该文档提供了有关如何初始化不同参数的全面详细信息。
与我的朋友一起,我们终于设法解决了这个问题。在调用 read() 之前需要先调用 AudioRecord.startRecording()。同样在你完成之后你应该调用 AudioRecord.stop()。我想知道为什么这么难找到这条基本信息
我已尝试将代码简化到最低限度,但仍然无法正常工作:
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);
}
总是returns -3 无论如何。我错过了什么?
您检查清单中的权限了吗?
</application>
<uses-permission android:name="android.permission.RECORD_AUDIO" />
文档说:
从音频硬件读取音频数据以记录到字节数组中。 AudioRecord构造函数中指定的格式应该是ENCODING_PCM_8BIT来对应数组中的数据
参数
audioData字节:写入录制音频数据的数组。 此值绝不能为空。
offsetInBytes int:写入数据的 audioData 中的索引,以字节表示。
sizeInBytes int:请求的字节数。 Returns
int 零或已读取的正字节数,或以下错误代码之一。字节数不会超过sizeInBytes.
ERROR_INVALID_OPERATION 如果对象没有正确初始化
我认为您应该检查 AudioRecord 对象的初始化。 所以看看这个答案:Android AudioRecord example
根据 Android 文档 -
-3表示是一个invalid operation.
Denotes a failure due to the improper use of a method.
Constant Value: -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) 的文档,该文档提供了有关如何初始化不同参数的全面详细信息。
与我的朋友一起,我们终于设法解决了这个问题。在调用 read() 之前需要先调用 AudioRecord.startRecording()。同样在你完成之后你应该调用 AudioRecord.stop()。我想知道为什么这么难找到这条基本信息