我正在玩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是一种非常传播的音频格式。
感谢。
答案 0 :(得分: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();