AudioRecord read() 未返回与 sizeInBytes 中请求的字节数相同的字节数

问题描述 投票:0回答:1

我在我的应用程序中构建了录音功能,并已将其投入生产几个月。从错误日志中,我发现有时,

read()
中的
AudioRecord
方法将返回与
sizeInBytes
参数中指示的字节数不同的字节数。

public int read(byte[] audioData, int offsetInBytes, int sizeInBytes)

下面是代码片段,可以帮助您更好地理解。

val audioRecordData = ByteArray(bufferSize)
val length = audioRecord.read(audioRecordData, 0, audioRecordData.size)
if (length == AudioRecord.ERROR_BAD_VALUE || length == AudioRecord.ERROR_INVALID_OPERATION || length != audioRecordData.size) {
    // Quitting because Audio record encountered fatal exception
    throw RuntimeException()
}

问题:即使

read()
返回的字节数不等于
audioRecord.read()
,继续调用
sizeInBytes
是否安全?

java android kotlin audiorecord android-audiorecord
1个回答
0
投票

是的。可以安全地继续。

该方法的 javadoc 说:

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

sizeInBytes

ERROR_INVALID_OPERATION
如果对象未正确初始化

ERROR_BAD_VALUE
如果参数未解析为有效数据和索引

ERROR_DEAD_OBJECT
如果对象不再有效并且需要重新创建。如果某些数据已成功传输,则不会返回死亡对象错误代码。在这种情况下,错误会在下一次 read() 时返回

ERROR
如果出现其他错误

在您的示例中,我可以想到两种情况,其中结果将大于零且小于

audioRecordData.size

  1. 您已接近音频文件的结尾,并且没有足够的未读字节来填充您提供的缓冲区。

  2. 您正在“实时”从设备或远程源读取音频流......并且它正在传递所有可用的音频字节......现在。

基本上,当

read
返回的字节数少于您要求的字节数时,您的应用程序需要采取适当的措施。

无论如何,

ERROR*
值都小于零,因此结果的正确解释是:

  • result < 0
    - 错误代码指示的错误
  • result == 0
    - 流结束
  • result > 0
    - 成功读取...结果值是读入提供的数组或
    ByteBuffer
    中的字节数(或短路数)。
© www.soinside.com 2019 - 2024. All rights reserved.