我正在尝试编写一个程序,该程序播放一个保存的.wav音频文件,同时显示声音振幅的曲线图。我使用图形库(JChart2D)和Java Sound包来实现此目的。问题在于以音频的相同频率(44100 hz)向图表馈送数据点,以便它们进行协调。
我尝试使用Thread.sleep()
方法,但是它不够准确。 5分钟的音频文件在结束时的等待时间超过10秒。
我也看到类似主题的答案,提示使用System.nanoTime()
进行“繁忙等待”,但是这会导致处理器上的负担过大(100%)。
如何实现? (也许与其他软件包或库一起使用,但最好建议与当前软件包或库一起使用)。
数据保存在字节数组中,并传递给Clip
进行回放,并且我想以44,100 Hz的频率馈送图形。
答案 0 :(得分:0)
图形通常以60 fps的帧速率显示。因此,您可以在一个视觉帧中绘制735(= 44100/60)个声音值的图表,还是特别需要尝试以与音频相同的速率运行声音?
就执行线程而言,Java在实时保证方面并不重要,因此尝试协调两个线程将非常困难。但是,由于SourceDataLine的write()方法采用了阻塞,因此Java在保持稳定的馈送方面做得很好,可以使声音数据正确播放。
使用SourceDataLine将使您有机会在播放声音时积累声音(因此可以更好地安排时间)。下面的链接提供了一些SourceDataLine的示例代码。
https://docs.oracle.com/javase/tutorial/sound/converters.html
在第一个示例中,在代码中(在while循环中)有一点,我们有此注释:
// Here, do something useful with the audio data that's
// now in the audioBytes array...
“有用”的东西是将字节解码为PCM值,然后将它们累加到大约735个值的数组中,以传递到图形线程。