Java 播放声音片段时出现问题

标签 java audio clip

我在使用 Clip 在 Java 中正确播放声音时遇到问题界面。

播放声音可以使用:

clip = (Clip)mixer.getLine(dataLineInfo);
clip.open(audioFormat, byteData, 0, byteData.length);
clip.start();

但是,如果剪辑未关闭,则会出现内存泄漏。

我尝试在开始剪​​辑之前添加一个线路监听器,并使用以下代码:

public void update(LineEvent e) {
    if (e.getType() == LineEvent.Type.STOP) {
        e.getLine().close();

但是,这会导致声音质量下降。

在方法中添加 1 秒 sleep 可以让事情在我的机器上再次运行 - 但我更喜欢更优雅的解决方案 - 我不认为在监听器方法中等待是好的做法,其他机器可能需要更长的时间。

奇怪的是,停止事件是在声音停止之前的任意时间发送的。

有人有更好的方法来解决这个问题吗?

(与 thisthisthis 相关,但对我来说都不是解决方案)

最佳答案

这似乎是 bug 4434125 中描述的症状。

该错误注释中建议的解决方案是调用 clip.drain() (在适当的线程中,因为它是阻塞调用),然后在排空完成时关闭剪辑(因为它将阻塞直到数据行的内部缓冲区被清空(根据 Javadocs for the drain method )。

关于Java 播放声音片段时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1922977/

相关文章:

objective-c - 用于在 Cocoa 中从 Mac 捕获音频并保存到文件的代码示例?

audio - FFMPEG : Change Video during encoding (using mapping)

python - 如何使用 rasterio/python 使用 shapefile 屏蔽栅格,将多边形内的栅格像素设置为零?

java - 从 Textview 选择文本时出错(java.lang.IndexOutOfBoundsException : setSpan (-1 . .. -1)在 0 之前开始)

image - svg 剪辑图像并显示描边

java - Rest Web 服务 - 对象映射器

java - android 7 : NullPointerException on APK installing with Runtime. getRuntime().exec

java - Guava 表与二维数组

java - 错误: Client does not support authentication protocol requested by server; consider upgrading MySQL client

html - 音频输出2台设备