【问题标题】:Play audio on server hardware在服务器硬件上播放音频
【发布时间】: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


【解决方案1】:

我的错,例外在其他地方。它适用于 java AudioSystem。这是一个sn-p:

// ...
protected File soundFile;
protected Clip clip;
protected LineListener listener;

public void play() {
    soundFile = new File(DIR_SOUND + audiotitle);
    AudioInputStream in = AudioSystem.getAudioInputStream(soundFile);
    clip = AudioSystem.getClip();
    clip.addLineListener(listener);
    clip.open(in);
    clip.start();
    // ...
}
// ...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-12
    • 1970-01-01
    • 2021-08-03
    • 1970-01-01
    • 1970-01-01
    • 2015-06-18
    • 1970-01-01
    • 2015-12-30
    相关资源
    最近更新 更多