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

Posted

技术标签:

【中文标题】在 Java 中使用声音计将声音从麦克风录制到文件【英文标题】:Record sound from mic to file with sound meter in Java 【发布时间】:2015-11-03 18:35:44 【问题描述】:

我正在尝试从麦克风录制到文件,同时对声音计的 audioInputStream 进行采样。我不知道如何将流/样本保存到文件中,同时缓冲样本以进行计量。以下是一些代码片段:

    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 文件时捕获数据以进行采样?

【问题讨论】:

【参考方案1】:

您最好的选择可能是简单地将原始音频数据转储到tempFile,然后在完成录制后将其转换为如下所示的波形:

final AudioInputStream in = new AudioInputStream(
        new FileInputStream(tempFile),
        format,
        tempFile.length()/format.getFrameSize()
);
AudioSystem.write(in, AudioFileFormat.Type.WAVE, file);
in.close();

wave format 在其块中规定了某些大小信息,这些信息实际上只能在所有数据到达后 写入。这使得从流中连续写入有点困难。它根本不是为了这样做。

【讨论】:

以上是关于在 Java 中使用声音计将声音从麦克风录制到文件的主要内容,如果未能解决你的问题,请参考以下文章

使用 ActionScript 3 将保存声音录制到文件中。不是来自麦克风

naudio 从麦克风录制声音然后保存

使用 NAudio 从麦克风录制声音。为啥不能正确地从列表中记录整个缓冲区?

Windows Phone 8 从麦克风 C# 录制声音

如何在 VB6 中从麦克风录制声音?

从麦克风录制的声音的音量