使用Java中的声音计从麦克风录制声音到文件

时间:2015-11-03 18:35:44

标签: java audio javasound

我正在努力尝试从麦克风录制文件,同时为音频表采样audioInputStream。我无法想象如何将流/样本保存到文件中,同时缓冲样本进行计量。这是一些代码片段:

onClick={(e) => (e.preventDefault(), this._handleShareClick(this.props.shareID))

然后我开始一个线程来捕获样本:

    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);
                ...

因为它当然会捕获到文件,但这永远不会回来,因为麦克风流不会关闭。我尝试了各种方法尝试将byte []数据更改为AudioInputStream但没有成功。

那么,如何在同步(或更好地异步)保存到麦克风的wav文件输入时捕获采样数据?

1 个答案:

答案 0 :(得分:2)

您最好的选择可能是将原始音频数据转储到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在其块中规定了某些大小信息,这些信息实际上只能在所有数据到达后写入。这使得从流中连续写入有点困难。它根本就不是那样做的。