有没有办法在 Java 的 Linux 上以合作的方式播放 WAV 文件?

Posted

技术标签:

【中文标题】有没有办法在 Java 的 Linux 上以合作的方式播放 WAV 文件?【英文标题】:Is there a way to play WAV files in a cooperative way on Linux in Java? 【发布时间】:2011-12-03 19:28:23 【问题描述】:

目前我只找到了两种方法:

    抛出异常 什么都不玩

广告 2。最近的代码(2010)

http://www.developerfusion.com/article/84314/wired-for-sound/

但什么都不做,一点也不响。

广告 1。例如:

Trouble playing wav in Java http://www.anyexample.com/programming/java/java_play_wav_sound_file.xml https://***.com/a/2433454/210342

我得到的只是异常“音频设备不可用”。正如这篇文章 (2008) -- lsof |grep snd — how to free a linux sound device -- 解释 Java 必须获得对音频设备的独占访问权。

但是我负担不起这样的条件。我使用声音来通知自己长时间运行的过程(几个小时),我无法摆脱所有声音(包括那些通过 Flash 广告强制执行的声音)只是为了让 Java 舒适。

所以现在我使用完全极端 - 我只是启动外部程序:https://***.com/a/8370223/210342。这太丑了,因为新程序只是为了发出通知而启动的。

问题

目前有没有办法播放WAV文件:

在 Linux 上, 以合作方式(在 Java 播放期间,可能还会播放其他音频), 发出声音, 在 Java 中(不启动外部程序)?

Java 1.6,openSUSE 11.4

【问题讨论】:

【参考方案1】:

你试过Java Media Framework (JMF)吗?

Java Media Framework API (JMF) 支持音频、视频和其他 将基于时间的媒体添加到基于 Java 构建的应用程序和小程序中 技术。这个可选包,它可以捕捉,播放, 流,并转码多种媒体格式,扩展了 Java 2 面向多媒体开发人员的平台标准版 (J2SE) 提供强大的工具包来开发可扩展的、跨平台的 技术。

【讨论】:

谢谢。实际上它对我不起作用;-) 但它对很多人不起作用,即使对于普通的 wav 文件也是如此。感谢其他与 JMF 相关问题的帖子,我发现了其他建议——比如尝试 VLC-J。【参考方案2】:

本网站提供了一个简单的 Swing 应用程序来捕获和播放 wav 文件 http://www.java-tips.org/java-se-tips/javax.sound/capturing-audio-with-java-sound-api.html 您可以修改和使用来自以下站点的代码 http://www.anyexample.com/programming/java/java_play_wav_sound_file.xml

您不能在需要播放操作时简单地创建一个新线程。这样无论后台进程如何,都可以继续播放

【讨论】:

请注意——我已经给出了第二个链接,它正在重复我已经提到的相同方法,它不起作用。声音不是被 Java 阻止的,而是被系统阻止的,添加新线程不会改变音频被阻止的事实(至少 Java 是这样认为的)。【参考方案3】:

所以,感谢 AT 的回答,我从 JMF 转向 JMF 问题,这导致我转向 VLC-J。这就是答案——为了在 Java 程序中使用多媒体,根本不使用 Java(可惜,顺便说一句,2012 年的 Java 没有可靠的多媒体层,哎呀。)。

标记为已解决,因为 VLC-J 让我可以毫无问题地播放音频。

主要项目地点: http://code.google.com/p/vlcj/

最小播放程序: http://code.google.com/p/vlcj/source/browse/trunk/vlcj/src/test/java/uk/co/caprica/vlcj/test/minimalmp3/Mp3Test.java

【讨论】:

好奇...你用什么 jdk 测试? openjdk vs sun 可能是个问题 @hricosrealm,在撰写 OP 时,我使用的是 Sun JDK。【参考方案4】:

Java 在 1.4+ 版本中内置了这种支持(在 javax.sound、javax.sound.sampled 包中可用)。当它使用平台混合器(ALSA 或 PULSE)时,它可以与系统上的其他应用程序协同工作

【讨论】:

您重复“答案”的次数越多,它就不会变得越正确。请下次阅读问题,提前谢谢。 @macias:在这种情况下,您是否检查过 /dev/(audio|mixer) 上的权限是否允许您打开设备?您可以写入 PULSE 套接字吗?您使用的是什么发行版? 如果我不能,我不会听到任何声音,对吗?再次检查问题,我提供了有关 Java 和系统的信息。但是,稍后我将按照回答结束这个问题,因为昨天 AT 的回答给了我正确的想法。 @macias:确实 vlcj 是一个解决方案,但它增加了一个额外的间接层 java 将依赖于依赖于 OSS|ALSA|Pulse 的 libvlc。请检查此线程以获得不同(不一定更好)的解决方案:forums.fedoraforum.org/showthread.php?t=248326 当然,我很乐意专注于纯 Java 解决方案,但遗憾的是,我没有找到任何解决方案,也没有时间测试和测试,这个和那个,以及其他一些东西。我在纯 Java 方法上花了太多时间,而 vlc-j 带走了我什么,下载 jar 并粘贴代码。工作完成。

以上是关于有没有办法在 Java 的 Linux 上以合作的方式播放 WAV 文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Linux 机器上以 root 用户身份运行 Elasticsearch 2.1.1

如何使用 C 在 Linux 上以编程方式杀死进程树

在 OS X 上以编程方式打开通知中心

在 iOS 13 上以编程方式滚动 SwiftUI ScrollView

Realm.js - default.realm 已经在当前线程上以不同的模式打开

在加载的JSON模型上以三个js动画颜色