1

我正在玩 javafx,我修改了 MediaPleyer 演示的代码,试图重现一个 wav 文件。它不起作用。

/*
 * Copyright (c) 2009, SUN Microsystems, Inc.
 * All rights reserved.
*/
package javafx.tools.fxd.demos.mediaplayer;

import javafx.scene.*;
import javafx.scene.media.*;
import javafx.stage.*;



var player = javafx.scene.media.MediaPlayer {
    repeatCount:  1
    media: Media {
        source: "{__DIR__}Door_Open.wav"
    };
};

class MyMediaPlayerUI extends MediaPlayerUI {
    override protected function contentLoaded()  {
        super.contentLoaded();
        var s = player.media.source;
        var i = s.lastIndexOf ("/");
        if (i >= 0) {
            s = s.substring (i + 1);
        }
        fileName.content = s;
    }
}

var stage : Stage;
var ui = MyMediaPlayerUI {};

var skins = [ "{__DIR__}MediaPlayer1.fxz", "{__DIR__}MediaPlayer2.fxz" ];
var index = 0;

ButtonController {
    pressed: bind ui.playPressed
    hovered: bind ui.playHovered
    normal: bind ui.playNormal
    activeArea: bind ui.playActiveArea
    action: function () {
        player.play ();
    }
}

ButtonController {
    pressed: bind ui.pausePressed
    hovered: bind ui.pauseHovered
    normal: bind ui.pauseNormal
    activeArea: bind ui.pauseActiveArea
    action: function () {
        player.pause ();
    }
}

ButtonController {
    pressed: bind ui.switchPressed
    hovered: bind ui.switchHovered
    normal: bind ui.switchNormal
    activeArea: bind ui.switchActiveArea
    action: function () {
        index = (index + 1) mod skins.size ();
        ui.url = skins[index];
    }
}

stage = Stage {
    title: "Media Player"
    //visible: true
    resizable: false
    onClose: function() { java.lang.System.exit (0); }
    scene: Scene {
        content: ui
    }
}

wav 文件没有任何例外都不会被复制。如果我将 repeatCount 属性更改为

repeatCount:  javafx.scene.media.MediaPlayer.REPEAT_FOREVER

最终给出一个堆空间异常:

Exception in thread "PlayerLoop" java.lang.OutOfMemoryError: Java heap space

上面的代码有问题吗?有没有办法重现 wav 文件?我认为这对于 javafx 是必不可少的,因为 wav 是一种非常普及的音频格式。

谢谢。

4

1 回答 1

1

JavaFx 文档对此很奇怪。在一个页面上,它说播放放在 jar 文件中的 wav 文件在另一个页面上说它不起作用。

对我来说,它对你不起作用。(有效的是播放放在 jar 文件中的 .wav 文件。)

这是我的问题解决方案(我自己的音频播放器)

    import java.net.URL;
    import javax.sound.sampled.AudioFormat;
    import javax.sound.sampled.AudioInputStream;
    import javax.sound.sampled.AudioSystem;
    import javax.sound.sampled.DataLine;
    import javax.sound.sampled.SourceDataLine;

    public class AudioPlayer {

        private static final int EXTERNAL_BUFFER_SIZE = 128000;
        private URL url_;

        public AudioPlayer(URL filename) {
            url_ = filename;
        }

        public void play() throws Exception {

            AudioInputStream audioInputStream = null;
            audioInputStream = AudioSystem.getAudioInputStream(url_);

            AudioFormat audioFormat = audioInputStream.getFormat();

            SourceDataLine line = null;
            DataLine.Info info = new DataLine.Info(SourceDataLine.class,
                    audioFormat);
            line = (SourceDataLine) AudioSystem.getLine(info);
            line.open(audioFormat);
            line.start();

            int nBytesRead = 0;
            byte[] abData = new byte[EXTERNAL_BUFFER_SIZE];

            while (nBytesRead != -1) {
                nBytesRead = audioInputStream.read(abData, 0, abData.length);
                if (nBytesRead >= 0) {
                    line.write(abData, 0, nBytesRead);
                }
            }

            line.drain();
            line.close();

        }
    }


    import javafx.async.RunnableFuture;

    public class PlayAudioImpl implements RunnableFuture {

        private AudioPlayer audio;

        public PlayAudioImpl(AudioPlayer audio) {
            this.audio = audio;
        }

        @Override
        public void run() throws Exception {
            audio.play();
        }
    }



    import javafx.async.JavaTaskBase;
    import javafx.async.RunnableFuture;

    import java.net.URL;

    public class PlayAudio extends JavaTaskBase  {
    public-init var source:String;

    public override function  create() : RunnableFuture {
        var player = new AudioPlayer(new URL(source));
        return new PlayAudioImpl(player);
    }

    public function play() : Void {
        start();
    }
   }

使用以下方式播放音频:

PlayAudio {
  source: "{__DIR__}audio/audio.wav"
  }.play();
于 2009-10-07T12:29:05.353 回答