1

DataLine.flush()的Javadoc状态

从线路中刷新排队的数据。刷新的数据被丢弃。在某些情况下,并非所有排队的数据都可以丢弃。例如,混音器可以从缓冲区中刷新特定输入行的数据,但仍然会播放输出缓冲区中已经存在的任何未播放数据(混合的结果)。如果您想在重新开始播放或捕获时跳过“陈旧”数据,您可以在暂停一行(正常情况)后调用此方法。(刷新未停止的行是合法的,但在活动行上这样做可能会导致数据不连续,从而导致可察觉的点击。)

这到底是什么意思?

此外,对于重新启动Clip对象,该站点上的许多人建议使用以下方法:

clip.stop();
clip.setFramePosition(0);
clip.start();

使用上面的代码时,我注意到一个示例剪辑(如果重要的话,大约 15 秒长)不会从一开始就重新启动,并且它的“重新启动位置”不一致。但是,当我尝试

clip.stop();
clip.flush();
clip.setFramePosition(0);
clip.start();

剪辑工作完美,并在声音开始时重新开始。我的问题是,flush() 方法做了什么来解决我之前的问题?另外,为什么我首先遇到了这个问题?

4

1 回答 1

4

像这样的数据线Clip有一个内部数据缓冲区,可能是byte[]. 缓冲区通常会在播放位置之前以块的形式填充。

假设在某个时刻我们有:

            playback position
                   v
buffer:         [..|.....]
  file: [..........|.....................]

因此,如果我们停止该行,缓冲区中仍然有数据——位于播放位置之前的数据。

如果我们所做的只是设置播放位置,则数据仍然存在,并且会在我们下次启动时播放。刷新该行会丢弃此数据。

我们也可以调用drain来等待这些数据被回放。

于 2015-04-24T08:31:18.347 回答