我已使用Android中的AudioRecord
类成功读取麦克风中的原始数据。在我的代码中,原始数据保存为:byte data[] = new byte[bufferSize];
此处bufferSize
是一个常数(我猜)7680
。我的第一个问题是:
byte data[] = new byte[bufferSize];
和byte[] data = new byte[bufferSize];
?在这两种情况下,我的代码似乎没有什么不同。
我的下一步是使用原始数据进行一些计算。为了更好的精度,我想将字节类型data
转换为float。这是代码:
private void writeAudioDataToFile() {
byte data[] = new byte[bufferSize];
String filename = getTempFilename();
FileOutputStream os = null;
try {
os = new FileOutputStream(filename);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
int read = 0;
if(null != os) {
while(isRecording) {
// First print: raw data from microphone
Log.v("print1", "data");
read = recorder.read(data, 0, bufferSize);
System.out.println(Arrays.toString(data));
// Second print: byte[] to float[]
Log.v("print2", "buff");
float[] inBufferMain = new float[bufferSize];
for (int i = 0; i < bufferSize; i++) {
inBufferMain[i] = (float) data[i];
}
System.out.println(Arrays.toString(inBufferMain));
// Calculating inBufferMain here
// ...
// Third print: float[] to byte[]
Log.v("print3", "data");
for (int i = 0; i < bufferSize; i++) {
data[i] = (byte) inBufferMain[i];
}
System.out.println(Arrays.toString(data));
if(AudioRecord.ERROR_INVALID_OPERATION != read) {
try {
os.write(data);
} catch (IOException e) {
e.printStackTrace();
}
}
}
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
在上面的代码中,从麦克风中读取data
后,我将其打印在logcat中。结果大约为1000
整数。 为什么1000
?因为缓冲区全部读取7680
位并保存为字节,即7680 / 8 ≈ 1000
。如果我的分析错误,请纠正我。但是在字节到浮点转换之后,结果只有600
个浮点数。 float数组中的前600个值与字节数组中的值相同,但缺少剩余的数字。我的打印方法有什么问题吗?
假设我已经处理了浮点数组,现在是浮点到字节转换的时候了。但第三次印刷的结果都是0
。如何将float []转换为byte []?
由于
答案 0 :(得分:1)
System.out.println(Arrays.toString(data));
将精确打印data.length
个字节,即bufferSize
。
logcat条目的大小是有限的,但是4076个字符。在加入", "
和字节的字符串表示的大小之间,1000是一个很好的估计。
漂浮物也是如此,除了它们通常更大以便印刷。
结论是您所看到的只是logcat有效负载的限制。见What is the size limit for Logcat and how to change its capacity?
答案 1 :(得分:1)
关于你的问题编号3.你可以利用ByteBuffer从float []转换为byte []。阅读Oracle文档:ByteBuffer.java
这个类有像putFloat()这样的实用程序方法和许多其他方法,进行这些类型的转换变得微不足道了:)