我制作了一个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 *样品。
答案 0 :(得分:0)
实际上,记录开始时间是最简单的答案。您可以使用帧数始终以令人难以置信的准确度(每帧!)确定任何声音的开始和停止时间。如果您的分析显示音高A从帧22050开始并结束33075,那么您知道声音从准确(开始+ 500)毫秒到(开始+ 750)毫秒。这只是一个简单的乘法运算。
您是否正在使用某种快速傅立叶分析来获得音高?
可以将事件通知绑定到Lines。在javax.sound.sampled api。中查看LineEvent和LineListener。
顺便说一句,由于JVM时间切片引入的变幻莫测,使用帧计数可能比时间戳更准确。 Java可以高度优先地连续/准确地播放声音,但实际上很少有实时保证。