【发布时间】:2015-08-26 17:56:32
【问题描述】:
我正在编写一个基于 Java EE 和 Wildfly 的闹钟(之前在 tomcat 上做过) 要求: - 安卓应用程序控制(自行开发) - 通过休息设置闹钟时间(完成) - 通过 ManagedScheduledExecutorService 进行调度(完成) - 在服务器硬件上播放音频文件(在我的房间里,附有音响系统)
tomcat:与 JMF javax.media.Player 一起正常工作 问题:tomcat 中没有并发工具
wildfly:使用 JMF 和 javafx Media 获取 NoPlayerException 严重崩溃
是否有可能使用 Java EE 在本机声卡上播放和“控制”音频?
有什么建议或经验吗?
(考虑过执行ffmpeg或mpg123等外部命令播放文件,但想尝试java方式)
服务器:linux debian 8 应用服务器:wildfly 9
编辑: 将 jmf 添加到 pom 中
<dependency>
<groupId>javax.media</groupId>
<artifactId>jmf</artifactId>
<version>2.1.1e</version>
</dependency>
简单的实验类,在定时任务中执行:
public class SoundPlayer {
protected Logger logger;
protected String DIR_SOUND;
protected String track;
protected File soundFile;
public SoundPlayer(String audio) {
DIR_SOUND = "/Users/rome/.alarm/sound/";
try {
File track = new File(DIR_SOUND + audio);
player = Manager.createPlayer(track.toURI().toURL());
player.addControllerListener(new SoundPlayerListener());
} catch (NoPlayerException | IOException e) {
log()
}
public void play() {
player.start();
}
public void stop() {
}
public void destroy() {
}
private class SoundPlayerListener implements ControllerListener, LineListener {
@Override
public void controllerUpdate(ControllerEvent event) {
logger.debug("Event received");
if (event instanceof StopEvent) {
logger.debug("Stop!!!");
}
}
@Override
public void update(LineEvent event) {
logger.debug("Event received!");
}
}
结果:
2015-08-27 07:46:49 ERROR stderr:71 - javax.media.NoPlayerException: Cannot find a Player for :file:/Users/rome/.alarm/sound/default.wav
2015-08-27 07:46:49 ERROR stderr:71 - at javax.media.Manager.createPlayerForContent(Manager.java:1412)
2015-08-27 07:46:49 ERROR stderr:71 - at javax.media.Manager.createPlayer(Manager.java:417)
JavaFX: 添加 jboss-deployment-structure.xml 和所有 javafx 路径条目:
<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.1">
<deployment>
<dependencies>
<system export="true">
<paths>
<path name="javafx/animation" />
<path name="javafx/application" />
<path name="javafx/beans" />
<path name="javafx/beans/binding" />
<path name="javafx/beans/property" />
<path name="javafx/beans/property/adapter" />
<path name="javafx/beans/value" />
<path name="javafx/collections" />
<path name="javafx/collections/transformation" />
<path name="javafx/concurrent" />
<path name="javafx/css" />
<path name="javafx/embed/swing" />
<path name="javafx/embed/swt" />
<path name="javafx/event" />
<path name="javafx/fxml" />
<path name="javafx/geometry" />
<path name="javafx/print" />
<path name="javafx/scene" />
<path name="javafx/scene/canvas" />
<path name="javafx/scene/chart" />
<path name="javafx/scene/control" />
<path name="javafx/scene/control/cell" />
<path name="javafx/scene/effect" />
<path name="javafx/scene/image" />
<path name="javafx/scene/input" />
<path name="javafx/scene/layout" />
<path name="javafx/scene/media" />
<path name="javafx/scene/paint" />
<path name="javafx/scene/shape" />
<path name="javafx/scene/text" />
<path name="javafx/scene/transform" />
<path name="javafx/scene/web" />
<path name="javafx/stage" />
<path name="javafx/util" />
<path name="javafx/util/converter" />
<path name="netscape/javascript" />
</paths>
</system>
</dependencies>
</deployment>
</jboss-deployment-structure>
不幸的是,我没有代码了,但它也只有几行,初始化媒体...我也尝试了剪辑,但无济于事 像这样:
JFXPanel panel = new JFXPanel();
Media sound = new Media(new File(musicFile).toURI().toString());
MediaPlayer mediaPlayer = new MediaPlayer(sound);
mediaPlayer.play();
提前谢谢
【问题讨论】:
-
执行外部命令。
-
JEE 环境包括所有普通的 JRE,这意味着您可以使用 javax.sound 或任何构建在它之上的库来播放声音。你试过什么?
-
@Durandal:我编辑了我的帖子并添加了一些代码示例。谢谢你看它
-
糟糕,那里的虚拟机崩溃了。这不应该发生,因此虚拟机或驱动程序中肯定存在错误。就我个人而言,我会先尝试将旧的 update everything 到当前版本,然后再进一步查看(但要小心,这总是会使事情变得更糟或引发大量其他问题)。如果您仍然遇到 VM 崩溃,请尝试找出崩溃的确切情况(如果可能,测试程序触发错误)并提交错误报告(对于 debian 或 oracle,希望崩溃日志会提示崩溃的原因)。
-
该死的。我打消了使用 java fx 的想法,这是一个非常糟糕的想法。我想我一直在虐待太多组件 :-) 所以我再次尝试了 AudioSystem 并发现异常来自未初始化的 ExecutorService :-|我修复了我的项目,现在它工作得很好。我会发布sn-p,以防万一它可以帮助某人。谢谢
标签: java jakarta-ee audio javafx jmf