2012-03-24 185 views
1

我有一个jsp,通过GlassFish中的java类播放wav文件。我已经使用SourceDataline方法:声音输出缓冲区冲洗

start(); 
drain(); 
close(); 

wav文件播放正常。对于停止我使用:

stop(); 
flush(); 
close(); 

但播放继续与输出缓冲区内的其余数据。我在www.oracle.com上查看了有关SourceDataline方法的文档。据说flush()将丢弃SourceDataline对象内的数据,但不会丢弃输出缓冲区内的数据。

现在我想从输出缓冲区中清除数据,以便在下次启动时不会有声音重叠。 我在JavaScript上搜索也没有帮助。

+0

只是好奇,JavaScript与此有什么关系? – 2012-03-24 05:16:16

+0

*“我有一个播放wav文件的jsp”*在哪里?在服务器上(它可以驱动系统操作员疯狂)?在客户端(它需要一个applet)? – 2012-03-24 10:35:37

回答

0

这主要是在黑暗中拍摄,但可以工作:为TargetDataLine.read的文件说:

从数据行的输入缓冲区读取音频数据。 (...)但是,如果在读取请求的数量之前数据行已关闭,停止,排空或刷新,则此方法不再阻塞,但会返回到目前为止读取的字节数。

所以,也许你可以尝试访问使用(可能使用Mixer.getTargetLines)的TargetDataLine的(一个或多个),并尝试过作用于他们(停止,刷新等)。但是,我不确定是否会有这样的副作用(或者甚至可能)。

是否有关于您可以分享的问题的其他信息?您提到了jsp,GlassFish和JavaScript,所以我猜测您要么使用Applet来播放文件,要么只是使用Java混合服务器端,但发送由浏览器处理的结果文件。这是否正确?

+0

是的,我在Java中使用AudioInputStream类的方法,而不是Applet。我正在对服务器上的音频进行采样并将结果发送到客户端浏览器。我会实施你的解决方案并让你知道。非常感谢你。 – 2012-03-24 06:02:18