Javafx и wav файлы - PullRequest
       11

Javafx и wav файлы

1 голос
/ 05 октября 2009

Я играю с 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, так как wavs - очень распространенный аудиоформат.

Спасибо.

1 Ответ

1 голос
/ 07 октября 2009

Документация JavaFx странная на этом.На одной странице написано, что воспроизведение wav-файлов, помещенных в jar-файлы, работает на другой, написано, что это не работает.

Для меня это не работает, как у вас.(Что работает, так это воспроизведение файлов .wav, которые не помещены в файлы jar.)

Вот мое решение проблемы (Мой собственный аудиоплеер)

    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();
...