【问题标题】:Android AudioRecord read always returns -3 (ERROR_INVALID_OPERATION)Android AudioRecord 读取总是返回 -3 (ERROR_INVALID_OPERATION)
【发布时间】:2017-11-20 02:11:20
【问题描述】:

我已经尝试将代码简化到最低限度,但它仍然不起作用:

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

【问题讨论】:

  • 我仍然需要一些帮助
  • 好的,所以一位朋友告诉我尝试将数组大小更改为缓冲区大小的一半。这使它返回 0 。肯定比 -3 好,但仍然不起作用

标签: java android audiorecord


【解决方案1】:

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

</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

【讨论】:

  • 你在 之后添加了它,仍然没有。还尝试添加 ActivityCompat.requestPermissions(this,new String[]{android.Manifest.permission.RECORD_AUDIO},200);所以现在它要求许可但没有效果
  • 你能把异常贴在这里吗?
  • 没有异常,只是返回-3,即ERROR_INVALID_OPERATION的错误码
  • 我认为您阅读了错误的文档,您阅读的是字节文档,而我使用的是短版本,应该与 16 位编码一起使用。数组也被正确初始化
【解决方案2】:

根据 Android 文档 -

-3 表示它是invalid operation

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

常数值:-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)) 的文档,该文档提供了有关如何初始化不同参数的全面详细信息。

【讨论】:

    【解决方案3】:

    与我的朋友一起,我们终于设法解决了这个问题。您需要在调用 read() 之前调用 AudioRecord.startRecording()。此外,完成后,您应该调用 AudioRecord.stop()。我想知道为什么很难找到这些基本信息

    【讨论】:

    • vivo x6 android 4.2.1 仍然无法工作,它显示:java.lang.IllegalStateException: startRecording() 调用了未初始化的 AudioRecord。
    • 这个帖子解决了我vivo的问题:stackoverflow.com/questions/4843739/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-01
    • 2019-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    相关资源
    最近更新 更多