Java声音回放和数据图协调的预录文件

时间:2018-10-19 15:10:25

标签: java performance audio synchronization javasound

我正在尝试编写一个程序,该程序播放一个保存的.wav音频文件,同时显示声音振幅的曲线图。我使用图形库(JChart2D)和Java Sound包来实现此目的。问题在于以音频的相同频率(44100 hz)向图表馈送数据点,以便它们进行协调。 我尝试使用Thread.sleep()方法,但是它不够准确。 5分钟的音频文件在结束时的等待时间超过10秒。 我也看到类似主题的答案,提示使用System.nanoTime()进行“繁忙等待”,但是这会导致处理器上的负担过大(100%)。

如何实现? (也许与其他软件包或库一起使用,但最好建议与当前软件包或库一起使用)。

数据保存在字节数组中,并传递给Clip进行回放,并且我想以44,100 Hz的频率馈送图形。

1 个答案:

答案 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个值的数组中,以传递到图形线程。