使用 Linux PulseAudio 时无法关闭 Java 音频 Clip

2023-12-30

我正在尝试在 Java 应用程序中播放声音,但该应用程序实际上从未终止,因为即使在尝试执行以下操作后,PulseAudio Eventloop 线程仍保持运行状态close https://docs.oracle.com/javase/8/docs/api/javax/sound/sampled/Line.html#close-- the Clip https://docs.oracle.com/javase/8/docs/api/javax/sound/sampled/Clip.html用于播放声音的实例:

import java.io.File;
import java.io.IOException;

import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.LineEvent;
import javax.sound.sampled.LineListener;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.UnsupportedAudioFileException;

final class AudioClipTest {

    public static void main(String[] args) throws UnsupportedAudioFileException, IOException, LineUnavailableException {
        try (AudioInputStream instream = AudioSystem.getAudioInputStream(new File("resources/test-sound.wav"))){
            final AudioFormat format = instream.getFormat();
            final Clip clip = (Clip) AudioSystem.getLine(new DataLine.Info(Clip.class, format));
            clip.addLineListener(new LineListener() {
                @Override
                public void update(final LineEvent event) {
                    if (event.getType() == LineEvent.Type.STOP) {
                        System.out.println("Finished playing audio.");
                        event.getLine().close();
                        // FIXME: This line is never reached on Linux with
                        // PulseAudio
                        System.out.println("Closed audio data line.");
                    }
                }
            });
            clip.open(instream);
            clip.start();
        }
    }

}

On my Linux machine, the above main method plays the relevant sound, prints

音频播放完毕。

and then hangs, while on a Windows‡ machine it prints

音频播放完毕。

关闭音频数据线。

并正确退出。

实际上ClipLinux机器上使用的实现是org.classpath.icedtea.pulseaudio.PulseAudioClip而在 Windows 上则是com.sun.media.sound.DirectAudioDevice.DirectClip; 这里发生了什么? - 什么是PulseAudioClip.close()做什么没有回报?


Distribution: Linux Mint 18.1; Kernel: 4.4.0-92-generic x86_64; OpenJDK: 8u131-b11-2ubuntu1.16.04.3; PulseAudio: 1:8.0-ubuntu3.3

‡Distribution: Windows 10 Pro; Version: 1703; OS Build: 15063.540 x64; Oracle JDK: 1.8.0_144-b01; DirectX: version 12


解决此问题的一种可能方法是使用 Alsa(用户空间)API 通过 Java 播放音频。 alsa 用户空间 API 将重定向到 PulseAudio(或另一个 API/混音器),因此您仍然应该获得正确的音频。

Edit $JAVA_HOME/jre/lib/sound.properties并注释掉所有相关的内容org.classpath.icedtea.pulseaudio并添加以下内容:

javax.sound.sampled.Clip=com.sun.media.sound.DirectAudioDeviceProvider
javax.sound.sampled.Port=com.sun.media.sound.PortMixerProvider
javax.sound.sampled.SourceDataLine=com.sun.media.sound.DirectAudioDeviceProvider
javax.sound.sampled.TargetDataLine=com.sun.media.sound.DirectAudioDeviceProvider

另外,请针对您的发行版的 openjdk 包提交错误。 PulseAudio/Java 绑定多年来一直不受支持,应该删除。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Linux PulseAudio 时无法关闭 Java 音频 Clip 的相关文章

  • Android:文本淡入和淡出

    我已阅读此 stackoverflow 问题和答案 并尝试实现文本淡入和淡出 Android中如何让文字淡入淡出 https stackoverflow com questions 8627211 how to make text fade
  • 将巨大的模式编译成Java

    有两个主要工具提供了将 XSD 模式编译为 Java 的方法 xmlbeans 和 JAXB 问题是 XSD 模式确实很大 30MB 的 XML 文件 大部分模式在我的项目中没有使用 所以我可以注释掉大部分代码 但这不是一个好的解决方案 目
  • java inputstream 打印控制台内容

    sock new Socket www google com 80 out new BufferedOutputStream sock getOutputStream in new BufferedInputStream sock getI
  • 如何使用 sed 仅删除双空行?

    我找到了这个问题和答案 https stackoverflow com questions 4651591 howto use sed to remove only triple empty lines关于如何删除三重空行 但是 我只需要对
  • 在 Java 中如何找出哪个对象打开了文件?

    我需要找出答案哪个对象在我的 Java 应用程序中打开了一个文件 这是为了调试 因此欢迎使用工具或实用程序 如果发现哪个对象太具体了 这class也会很有帮助 这可能很棘手 您可以从使用分析器开始 例如VisualVM http visua
  • 断言 Kafka 发送有效

    我正在使用 Spring Boot 编写一个应用程序 因此要写信给 Kafka 我这样做 Autowired private KafkaTemplate
  • 如何在 Spring 中使 @PropertyResource 优先于任何其他 application.properties ?

    我正在尝试在类路径之外添加外部配置属性资源 它应该覆盖任何现有的属性 但以下方法不起作用 SpringBootApplication PropertySource d app properties public class MyClass
  • 如何仅从 Firestore 获取最新更新的数据?

    在 Firestore 上发现任何更改时始终获取整个文档 如何只获取最近更新的数据 这是我的数据 我需要在第一次加载时在聊天中按对象顺序 例如 2018 09 17 30 40 msg和sendby 并且如果数据更新则仅获取新的msg和se
  • Akka 与现有 java 项目集成的示例

    如果我已经有现有的javaWeb 应用程序使用spring and servlet容器 将 Akka 集成到其中的正确方法是什么 就像我将会有Actor1 and Actor2互相沟通的 开始使用这些演员的切入点是什么 例如 1 把它放在那
  • 信号处理程序有单独的堆栈吗?

    信号处理程序是否有单独的堆栈 就像每个线程都有单独的堆栈一样 这是在 Linux C 环境中 来自 Linux 手册页signal 7 http kernel org doc man pages online pages man7 sign
  • 如何区分从 Saxon XPathSelector 返回的属性节点和元素节点

    给定 XML
  • Java Swing - 如何禁用 JPanel?

    我有一些JComponents on a JPanel我想在按下 开始 按钮时禁用所有这些组件 目前 我通过以下方式显式禁用所有组件 component1 setEnabled false 但是有什么办法可以一次性禁用所有组件吗 我尝试禁用
  • 为什么\0在java中不同系统中打印不同的输出

    下面的代码在不同的系统中打印不同的输出 String s hello vsrd replace 0 System out println s 当我在我的系统中尝试时 Linux Ubuntu Netbeans 7 1 它打印 When I
  • 使用 HtmlUnit 定位弹出窗口

    我正在构建一个登录网站并抓取一些数据的程序 登录表单是一个弹出窗口 所以我需要访问这个www betexplorer com网站 在页面的右上角有一个登录链接 写着 登录 我单击该链接 然后出现登录弹出表单 我能够找到顶部的登录链接 但找不
  • 列表过滤器内的 Java 8 lambda 列表

    示例 JSON id 1 products id 333 status Active id 222 status Inactive id 111 status Active id 2 products id 6 status Active
  • java XMLSerializer 避免复杂的空元素

    我有这个代码 DocumentBuilderFactory factory DocumentBuilderFactory newInstance DocumentBuilder builder factory newDocumentBuil
  • java 中的蓝牙 (J2SE)

    我是蓝牙新手 这就是我想做的事情 我想获取连接到我的电脑上的蓝牙的设备信息并将该信息写入文件中 我应该使用哪个 api 以及如何实现 我遇到了 bluecove 但经过几次搜索 我发现 bluecove 不能在 64 位电脑上运行 我现在应
  • 并行运行 make 时出错

    考虑以下制作 all a b a echo a exit 1 b echo b start sleep 1 echo b end 当运行它时make j2我收到以下输出 echo a echo b start a exit 1 b star
  • 在 Linux 中禁用历史记录 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 要在 Linux 环境中禁用历史记录 我执行了以下命令 export HISTFILESIZE 0 export HISTSIZE 0 u
  • Spring RESTful控制器方法改进建议

    我是 Spring REST 和 Hibernate 的新手 也就是说 我尝试组合一个企业级控制器方法 我计划将其用作未来开发的模式 您认为可以通过哪些方法来改进 我确信有很多 RequestMapping value user metho

随机推荐

  • Java 日历/日期 2010 年 10 月 2 日有错误吗?

    我不确定我做错了什么 但我有一段代码可以计算两个日期之间的天数 如下所示 final Calendar first new GregorianCalendar 2010 Calendar OCTOBER 1 final Calendar l
  • 如何使用 nanosleep 随机睡眠时间?

    我正在尝试使用 nanosleep 函数让我的进程休眠 1 10 秒之间的随机时间 我使用 srand 为我的随机数生成器提供种子 并带有进程 ID 即我调用 srand getpid 然后使用 struct timespec delay
  • Kubernetes Pod 内存与 cgroup

    我在 Kubernetes pod 中运行 apache 并且对 apache 进程的随机 OOM 终止感到困扰 并且我不确定原因 Pod 有 600M 内存限制 即使 PHP 每次运行有 128 MB 限制 它似乎也可以很容易地消耗它 观
  • 如何在 Windows 中使用 H264 视频编码器 MFT 编码位图

    我的应用程序对从 GDI 或 DXGI 方法捕获的帧进行编码 目前我正在使用帮助 x264 库进行编码 AFAIK x264 是基于软件的库 我想在 GPU 的帮助下进行编码 这样它可以节省 CPU 周期 并且希望速度也会更快 经过搜索 我
  • 如何在 Google 中搜索代码和其他与编程相关的关键字?它似乎剥离了特殊字符

    我在使用 Google 时遇到的问题之一是 它似乎删除了特殊字符 例如点 逗号和其他一些特殊字符 而这些字符通常是我在尝试查找与编程相关的内容时要查找的内容 ex django sign返回不相关的数据 也许您知道一种方法 或替代方案 技术
  • 将值存储在 MIPS 的 HI 和 LO 寄存器中

    我正在 MIPS 中编写某些代码 并且要求将结果暂时存储在HI and LO特殊寄存器 均为 4 字节宽 这些说明可供我使用 divu s t lo lt s div t hi lt s mod t multu s t hi lo lt s
  • 朱莉娅似乎很慢

    我正在运行此中所示的代码question https stackoverflow com questions 73599180 plot not showing in julia 73599239 我预计它第二次和第三次运行得更快 第一次运
  • 如何将列表列转换为 R 中 tibble 中的向量

    我试图折叠下面的小标题 称为数据 中的 周 列 以便结果是具有两列的小标题 1 表示周 另一列表示相关值 由于周列是一个列表 我不知道该怎么做 能否请你帮忙 gt head data A tibble 6 x 1 Weeks Value
  • Oracle SQL Developer 和 PostgreSQL

    我正在尝试使用 Oracle SQL Developer 3 0 04 连接到 PostgreSQL 9 1 数据库 但到目前为止我还没有取得任何成功 首先 如果我在首选项中添加第三方驱动程序 则在添加新连接时 没有 PostgreSQL
  • 测量要在 Canvas 上绘制的文本宽度(Android)

    是否有一种方法可以根据用于绘制文本的 Paint 使用 drawText 方法返回要在 Android 画布上绘制的文本的宽度 以像素为单位 你看过吗android graphics Paint measureText String txt
  • 如何在 Greasemonkey 脚本中播放声音?

    如何在 Greasemonkey 脚本中播放声音 我目前想做的是在达到条件时播放声音 例如 UserScript name Sound Alert namespace example com include example com requ
  • 检查 Postgresql 是否正在监听

    给定 IP 地址和端口号 是否可以检查具有该 IP 地址的计算机是否在指定端口上侦听 Postgresql 如果是这样 怎么办 我只想获取Postgresql是否正在监听指定机器的指定端口的布尔值 例如 您可以使用nmap http nma
  • 这个八位字节流如何被解释为希伯来语 UTF-8 编码?

    下面的字节流被标识为UTF 8 它包含希伯来语句子 我正在尝试理解编码 ubuntu ip 10 126 21 104 od t x1 homeless title fromwireshark followed by hexdump txt
  • 如何正确制作阴影贴图的深度立方体贴图?

    我已经编写了代码将场景对象渲染为以下格式的立方体贴图纹理GL DEPTH COMPONENT然后在着色器中使用此纹理来确定片段是否被直接照亮 以用于阴影目的 然而 我的立方体贴图看起来是黑色的 我想我没有充分设置我的 FBO 或渲染上下文
  • CSRF 保护:我们是否必须为每个表单生成一个令牌?

    我们是否必须为网站中的每个表单生成一个令牌 我的意思是 每次为每个请求的表单生成不同的令牌 如果没有 为什么 一般来说 只要有每个会话一个令牌 https www owasp org index php Cross Site Request
  • 将“默认”数组与“输入”数组合并? PHP 哪个函数?

    假设您让用户提供信息 Array 1 但并非全部都是必需的 所以你有默认值 Array 2 PHP 是否有一个函数可以覆盖所有数组值Array 2基于它们是否提供Array 1 而不是空的 我想你正在寻找的是array replace re
  • WinRm - 由于 SSL 证书不正确,无法在 HTTPS 上创建 WinRM 侦听器

    我想将 WinRM 与 https 传输结合使用 我购买了 Comodo 证书 错误表明我无法使用自签名证书 其主题与我的 Windows 10 计算机 未加入域 的 FQDN 系统中的完整计算机名称 相匹配 CN my domain ne
  • 我们可以在不更改APP版本的情况下更新Google Play商店上的APK吗

    谁能告诉我 我可以替换上传到 Google Play 商店的 APK 而不更改应用程序版本吗 基本上我昨天已经上传了 1 0 版本的应用程序 今天我想重新上传 APK 并进行一些重要的修复 并且不想更改版本 You cannot更新现有应用
  • Linux:如何检查进程可用的最大连续地址范围

    我想在命令行输入pid 取回未被保留的最大连续地址空间 有任何想法吗 我们的 32 位应用程序在 64 位 RHEL 5 4 上运行 运行一段时间后 比如 24 小时 就会崩溃 当时仅使用了 2 5 GB 的内存 但我们遇到了内存不足的错误
  • 使用 Linux PulseAudio 时无法关闭 Java 音频 Clip

    我正在尝试在 Java 应用程序中播放声音 但该应用程序实际上从未终止 因为即使在尝试执行以下操作后 PulseAudio Eventloop 线程仍保持运行状态close https docs oracle com javase 8 do