2014-04-21 6 views
7

Ho appena iniziato a lavorare con JavaFX. So come funzionano le basi. Ho provato a utilizzare i media e le classi di mediaplayer per riprodurre un suono, chiamato "sound.mp3". Sto programmando in eclissi e ho il file audio nella cartella src, la stessa cartella di "(pacchetto predefinito)". Ecco il mio codice:Come riprodurre suoni con JavaFX

import javafx.scene.media.*; 
import javafx.application.Application; 
import javafx.scene.Scene; 
import javafx.scene.layout.StackPane; 
import javafx.stage.Stage; 

public class Main extends Application{ 

public static void main(String[] args){ 
    launch(args); 
} 

@Override 
public void start(Stage primaryStage){ 
    primaryStage.setTitle("Hello World!"); 

    String ssound = "sound.mp3"; 
    Media sound = new Media(ssound); 
    MediaPlayer mediaPlayer = new MediaPlayer(sound); 
    mediaPlayer.play(); 

    StackPane root = new StackPane(); 
    primaryStage.setScene(new Scene(root, 800, 450)); 
    primaryStage.show(); 
} 
} 

Per favore dimmi cosa sto facendo male.

Qui è la cosa messaggio di errore dalla console:

Exception in Application start method 
Exception in thread "main" java.lang.RuntimeException: Exception in Application start method 
    at com.sun.javafx.application.LauncherImpl.launchApplication1(Unknown Source) 
    at com.sun.javafx.application.LauncherImpl.access$000(Unknown Source) 
    at com.sun.javafx.application.LauncherImpl$1.run(Unknown Source) 
    at java.lang.Thread.run(Thread.java:724) Caused by: java.lang.IllegalArgumentException: uri.getScheme() == null! 
    at com.sun.media.jfxmedia.locator.Locator.<init>(Unknown Source) 
    at javafx.scene.media.Media.<init>(Unknown Source) 
    at Main.start(Main.java:16) 
    at com.sun.javafx.application.LauncherImpl$5.run(Unknown Source) 
    at com.sun.javafx.application.PlatformImpl$5.run(Unknown Source) 
    at com.sun.javafx.application.PlatformImpl$4$1.run(Unknown Source) 
    at com.sun.javafx.application.PlatformImpl$4$1.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at com.sun.javafx.application.PlatformImpl$4.run(Unknown Source) 
    at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(Unknown Source) 
    at com.sun.glass.ui.win.WinApplication._runLoop(Native Method) 
    at com.sun.glass.ui.win.WinApplication.access$100(Unknown Source) 
    at com.sun.glass.ui.win.WinApplication$3$1.run(Unknown Source) ... 1 more 
+1

In base a 'uri.getScheme() == null', presumo che sia necessario fornire un URI per il file audio, anziché solo un nome file. –

+1

"L'origine deve rappresentare un URI valido ed è immutabile. Sono supportati solo gli URL HTTP, FILE e JAR." http://docs.oracle.com/javafx/2/api/javafx/scene/media/Media.html#Media(java.lang.String) –

risposta

2

Questo è quello che sono attualmente in uso:

Media hit = new Media(new File(soundFilename).toURI().toString()); 
+0

questa non è una risposta completa. Questo non sta riproducendo un suono. –

9

Basta una raccolta di lavoro di quello che dicono gli altri risposte:

String musicFile = "StayTheNight.mp3";  // For example 

Media sound = new Media(new File(musicFile).toURI().toString()); 
MediaPlayer mediaPlayer = new MediaPlayer(sound); 
mediaPlayer.play(); 

Aggiungere il file musicale nella cartella Progetto, accanto a bin e src.

Qualsiasi IDE vi verrà chiesto di aggiungere questi così:

import javafx.scene.media.Media; 
import javafx.scene.media.MediaPlayer; 
import java.io.File; 

funziona come un fascino.

+0

Grazie! Ho provato ad usare JOAL per suonare il suono, ma ha suonato un brutto suono scoppiettante alla fine di ogni file wav, e si è rivelato troppo complicato solo per suonare i suoni. Questo risolve il mio problema. – AvaLanCS

3
mApplause = new AudioClip(this.getClass().getResource("/sounds/applause.mp3").toExternalForm()); 

Quindi questo è ciò che ho usato e ha funzionato, so che probabilmente non importa più, ma dal momento che ha ottenuto nella mia ricerca Google, mentre ero alla ricerca di qualcosa di diverso ho pensato di rispondere ad esso. :)

Significato del modulo toExternal che indica di formare un modulo di URL del file di percorso.

+1

È consigliabile utilizzare la classe AudioClip solo per riprodurre file audio corti. Memorizza i dati audio grezzi e non compressi per l'intero suono, che può essere abbastanza grande per lunghe clip audio. Per maggiori informazioni: https://docs.oracle.com/javafx/2/api/javafx/scene/media/AudioClip.html – ryuujin