1

我制作了一个 java 录音机,想知道我录制的每个音频样本的系统时间戳。我以 44.1KHz 录制 1 秒。对于每个样本(有 441000 个),我想记录麦克风检测到声音的时间(系统时间戳)。如果可能的话,我将如何做到这一点?我想要+-1ms的精度。

这是我正在使用的代码的快照。

AudioFormat format = new AudioFormat(44100f, 8, 1, true, false);
DataLine.Info info = new DataLine.Info(TargetDataLine.class, format);
TargetDataLine line = (TargetDataLine) AudioSystem.getLine(info);
line.open(format);
line.start();
byte[] buff = new byte[line.getBufferSize()];
while(recording){
    int index = line.read(buff, 0, buff.length);
    out.write(buff, 0, index);
}
line.stop();
line.close();
byte[] audio = out.toByteArray();

谢谢

编辑

只要它准确,就可以每隔一个样本,甚至每 10 个样本获取一个时间戳。我的意思是 44100* 个样本。

4

1 回答 1

1

实际上,记录开始时间是最简单的答案。通过使用帧数,您始终可以以令人难以置信的准确度(每帧!)确定任何声音的开始和停止时间。例如,在每秒 44100 帧的情况下,如果您的分析显示音高 A 从第 22050 帧开始并在 33075 帧结束,那么您知道声音正好从 (start + 500) 毫秒变为 (start + 750) 毫秒。这只是一个简单的乘法运算。

您是否使用某种快速傅立叶分析来获得音高?

可以将事件通知绑定到线路。查看 javax.sound.sampled api 中的 LineEvent 和 LineListener。

顺便说一句,由于 JVM 时间片引入的变幻莫测,使用帧计数可能比时间戳更准确。Java 为声音的连续/准确播放提供了高优先级,但几乎没有实时保证。

于 2013-09-08T20:30:38.940 回答