Android Audiorecord.read()中值的含义

Android Audiorecord.read()中值的含义,android,audio-recording,audiorecord,Android,Audio Recording,Audiorecord,我试图理解Audiorecord.read()获得的值实际上意味着什么 我正在尝试创建一个应用程序,当它检测到脉冲响应时,它将开始录制声音(因此我不得不设置一个treshold,其中任何高于它的声音都将被视为脉冲) 问题是,当我调用此方法时,我真的不知道“data”中存储的值代表什么: read = recorder.read(data, 0, bufferSize); 以下是我获得的一些值: [96,2,101,3,101,2,110,1,-41,2,-80,2,-117,2,119,2,-

我试图理解Audiorecord.read()获得的值实际上意味着什么

我正在尝试创建一个应用程序,当它检测到脉冲响应时,它将开始录制声音(因此我不得不设置一个treshold,其中任何高于它的声音都将被视为脉冲)

问题是,当我调用此方法时,我真的不知道“data”中存储的值代表什么:

read = recorder.read(data, 0, bufferSize);
以下是我获得的一些值:

[96,2,101,3,101,2,110,1,-41,2,-80,2,-117,2,119,2,-94,0……]

这个想法是根据这些值设置treshold,但首先我需要知道它们代表什么


你们能帮我吗?

数据取决于发送给构造函数的参数。音频记录(int audioSource、int sampleRateInHz、int channelConfig、int audioFormat、int bufferSizeInBytes)

sampleRateInHz是每秒的采样数。通道配置为单声道或立体声,表示1或2个通道。格式为PCM8或PCM16,表示每个样本8位或16位

因此,数据是一个样本数组。每个样本都是一组通道。根据您的要求,每个通道将有一个8或16位的值。不会跳过任何数据,它将始终是固定大小的格式

所以,如果您选择1个通道和8个位,每个字节都是一个单独的声音,您应该可以看到sampleRateInHz每秒的声音。如果选择16位,则每个声音的长度为2字节。如果使用2个通道,则每个样本的顺序应为通道1,然后是通道2


单个值是以请求的频率采样时声音数据的振幅。有关其工作原理的更多信息,请参阅。

因此,如果我到目前为止的理解是正确的,那么上面数组中表示的每个值都是8位有符号数(1字节),因此它们的范围从-128到127。但由于我使用的是16位PCM,所以我必须同时使用2个样本,这将产生一个16位样本,它将给我从-32768到32767的值。答案正确,逻辑错误。因为您使用的是16位pcm,所以每个值是2个字节,从-32768到32767。如果您使用的是mono,则可以将该数组视为16位样本的数组。如果您使用立体声,可以将每对值视为一个样本,第一个值为左,第二个值为右。您知道如何设置具有精确大小的预定义字节数组来存储麦克风发出的“x”秒声音吗?我知道AudioRecord.getMinBufferSize(录音机采样器、录音机频道、录音机)‌​DIO_编码);但我真的不知道缓冲区大小对应的时间量。我需要一个音频应用程序,我正在使用一个环形缓冲区来存储麦克风检测到脉冲响应前0.5秒的样本,以及检测到脉冲后1.5秒的样本。知道吗?x秒的最小值是8位的XSAMPLETECHANNEL,是16位的两倍。