使用java应用程序录制时录制音频样本的时间戳

时间:2013-09-08 01:31:32

标签: java audio timestamp audio-recording javasound

我制作了一个java录音机,想知道我录制的每个音频样本的系统时间戳。我在44.1KHz录制1秒钟。对于每个样本(theres 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 *样品。

1 个答案:

答案 0 :(得分:0)

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

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

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

顺便说一句,由于JVM时间切片引入的变幻莫测,使用帧计数可能比时间戳更准确。 Java可以高度优先地连续/准确地播放声音,但实际上很少有实时保证。