2009-10-05 10 views
1

Je joue avec javafx et j'ai modifié le code de la démo de MediaPleyer en essayant de reproduire un fichier wav. Ça ne marche pas.Fichiers Javafx et 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 
    } 
} 

Le fichier wav n'est pas reproduit sans exception. Si je change la propriété repeatCount à

repeatCount: javafx.scene.media.MediaPlayer.REPEAT_FOREVER 

donne finalement une exception espace de tas:

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

Il y a un problème dans le code ci-dessus? Il existe un moyen de reproduire des fichiers WAV? Je pense que c'est essentiel pour javafx puisque les wavs sont un format audio très répandu.

Merci.

+0

Ce doit être quelque chose lié au fichier lui-même parce que j'ai essayé le "chord.wav" de Windows et cela fonctionne. – Averroes

+0

Dans ce cas, lorsque le son finit sa première reproduction et que je clique sur rejouer, j'obtiens cette exception: Exception dans le thread "AWT-EventQueue-1" com.sun.media.jmc.OperationUnsupportedException: l'homologue du lecteur multimédia ne peut pas définir l'heure du média sur temps: 1.207031191 C'est assez frustrant. – Averroes

Répondre

1

La documentation de JavaFx est étrange sur celui-là. Sur une page, il est dit que lire des fichiers wav placés dans des fichiers jar fonctionne sur un autre, il dit que cela ne fonctionne pas.

Pour moi cela ne fonctionne pas comme pour vous. (Ce qui fonctionne est la lecture des fichiers .wav qui sont pas placés dans des fichiers jar.)

Voici ma solution pour le problème (Ma audioplayer)

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

jouer en utilisant l'audio:

PlayAudio { 
    source: "{__DIR__}audio/audio.wav" 
    }.play(); 
+0

Merci pour votre aide, Alexander. – Averroes