刷新该行的排队数据。刷新的数据被丢弃。在某些情况下,并非所有排队的数据都可以被丢弃。例如,混音器可以从缓冲区刷新特定输入行的数据,但仍然会播放输出缓冲区中已经存在的任何未播放数据(混合的结果)。如果你想跳过" stale"你可以在暂停一行(正常情况)之后调用这个方法。重新开始播放或捕获时的数据。 (冲洗未停止的线是合法的,但在活动线上这样做可能会导致数据不连续,从而导致可察觉的点击。)
这究竟是什么意思?
此外,为了重新启动Clip
对象,此网站上的许多人建议使用此功能:
clip.stop();
clip.setFramePosition(0);
clip.start();
当使用上面的代码时,我注意到一个样本片段(如果重要的话,大约15秒)不会在开始时重新开始,并且在其重新开始的位置不一致。"但是,当我尝试
时clip.stop();
clip.flush();
clip.setFramePosition(0);
clip.start();
剪辑完美无缺,并在声音开始时重新启动。我的问题是,flush()方法为修复我之前的问题做了什么?另外,为什么我首先遇到这个问题?
答案 0 :(得分:4)
像Clip
这样的数据行有一个内部数据缓冲区,可能是byte[]
。缓冲区通常在播放位置之前填充块。
假设在某个瞬间我们有:
playback position
v
buffer: [..|.....]
file: [..........|.....................]
因此,如果我们停止该行,缓冲区仍然有数据 - 数据位于播放位置之前。
如果我们所做的只是设置播放位置,数据仍然存在,并在下次启动时播放。刷新该行会丢弃此数据。
我们也可以致电drain
等待播放这些数据。