在 Java 中使用声表将麦克风的声音记录到文件
Record sound from mic to file with sound meter in Java
我正在尝试从麦克风录制到文件,同时对声级计的 audioInputStream 进行采样。我不知道如何将 stream/sample 保存到一个文件中,同时缓冲一个样本进行计量。下面是一些代码片段:
format = new AudioFormat(11025, 16, 1, true, true);
DataLine.Info info = new DataLine.Info(TargetDataLine.class, format);
TargetDataLine line = (TargetDataLine) AudioSystem.getLine(info);
line.open(format);
line.start(); // start capturing
in = new AudioInputStream(line);
然后我启动一个线程来捕获样本:
int bytesRead = in.read(buffer, readPoint, buffer.length - readPoint);
if (bytesRead == -1) {
notYetEOF = false;
break;
}
int leftover = bytesRead % frameSize;
calculateRMSLevel(buffer, readPoint, leftover);
...
这就是我卡住的地方。我知道我不能只使用:
AudioSystem.write(in, fileType, file);
因为它当然会捕获到文件,但这永远不会回来,因为麦克风流没有关闭。我已经尝试了多种尝试将 byte[] 数据更改为 AudioInputStream 的方法,但都没有成功。
那么,如何在同步(或更好地异步)保存到从麦克风输入的 wav 文件的同时捕获数据进行采样?
您最好的选择可能是简单地将原始音频数据转储到 tempFile
,完成录制后,将其转换为 wave,如下所示:
final AudioInputStream in = new AudioInputStream(
new FileInputStream(tempFile),
format,
tempFile.length()/format.getFrameSize()
);
AudioSystem.write(in, AudioFileFormat.Type.WAVE, file);
in.close();
wave format 在其块中规定了特定大小的信息,这些信息实际上只能在 所有数据到达后才能写入。这使得从流中连续写入有点困难。它根本不是为了那样做。
我正在尝试从麦克风录制到文件,同时对声级计的 audioInputStream 进行采样。我不知道如何将 stream/sample 保存到一个文件中,同时缓冲一个样本进行计量。下面是一些代码片段:
format = new AudioFormat(11025, 16, 1, true, true);
DataLine.Info info = new DataLine.Info(TargetDataLine.class, format);
TargetDataLine line = (TargetDataLine) AudioSystem.getLine(info);
line.open(format);
line.start(); // start capturing
in = new AudioInputStream(line);
然后我启动一个线程来捕获样本:
int bytesRead = in.read(buffer, readPoint, buffer.length - readPoint);
if (bytesRead == -1) {
notYetEOF = false;
break;
}
int leftover = bytesRead % frameSize;
calculateRMSLevel(buffer, readPoint, leftover);
...
这就是我卡住的地方。我知道我不能只使用:
AudioSystem.write(in, fileType, file);
因为它当然会捕获到文件,但这永远不会回来,因为麦克风流没有关闭。我已经尝试了多种尝试将 byte[] 数据更改为 AudioInputStream 的方法,但都没有成功。
那么,如何在同步(或更好地异步)保存到从麦克风输入的 wav 文件的同时捕获数据进行采样?
您最好的选择可能是简单地将原始音频数据转储到 tempFile
,完成录制后,将其转换为 wave,如下所示:
final AudioInputStream in = new AudioInputStream(
new FileInputStream(tempFile),
format,
tempFile.length()/format.getFrameSize()
);
AudioSystem.write(in, AudioFileFormat.Type.WAVE, file);
in.close();
wave format 在其块中规定了特定大小的信息,这些信息实际上只能在 所有数据到达后才能写入。这使得从流中连续写入有点困难。它根本不是为了那样做。