2012-08-27 18 views
5

Sé que esta es una pregunta recurrente. verifique uno original here o here.jugando archivo .mp3 en java con el bloc de notas

Así que mi código es sólo la goma de la copia:

import javafx.scene.media.*; 

class Gui { 
    public static void main(String[] args) { 
    try{ 
     Media hit = new Media("skin.mp3"); 
     MediaPlayer mediaPlayer = new MediaPlayer(hit); 
     mediaPlayer.play(); 
    }catch(Exception e){ 
     e.printStackTrace(); 
    } 
    } 
} 

La excepción que estoy consiguiendo es:

java.lang.IllegalArgumentException: uri.getScheme() == null! 
     at com.sun.media.jfxmedia.locator.Locator.<init>(Locator.java:217) 
     at javafx.scene.media.Media.<init>(Media.java:364) 
     at Gui.main(gui.java:6) 

Estoy compilando & funcionando correctamente, es decir, mediante la inclusión del archivo jfxrt.jar en classpath

Nota: Solo estoy usando notepad en lugar de cualquier IDE.

Así puede alguien decirme la razón de IllegalArgumentException

Thankx

ACTUALIZACIÓN: Mediante el uso de file://e:/skin.mp3 funcionó bien, pero me dejó con otra excepción:

MediaException: MEDIA_INACCESSIBLE : e 
     at javafx.scene.media.Media.<init>(Unknown Source) 
     at Gui.main(gui.java:6) 

lo que si puede aclarar esta excepción

Por cierto, he comprobado la canción, no está corrupta porque está jugando muy bien en vlc.

+1

* "no está dañado porque está jugando muy bien en vlc." * ¡LOL! Los reproductores de medios hacen todo lo posible para garantizar que puedan reproducir casi cualquier archivo de basura que se les arroje. Si necesita confirmar la validez de un archivo, hágalo usando un programa que esté diseñado para verificar. –

+0

¡LOL! ........... – user1574009

Respuesta

5

A partir de los documentos de la API de JavaFX

  • El URI suministrado debe ajustarse a RFC-2396 como lo requiere la java.net.URI.
  • Solo son compatibles los URI HTTP, FILE y JAR.

Por lo tanto, sospecho de lectura de la documentación, es necesario proporcionar una ruta URI.

Algo así como file://path/to/file/skin.mp3 probablemente funcione.

+2

Y para obtener esa URL, puede hacer 'new File (" skin.mp3 "). ToURI(). ToString()' – Thilo

+0

Hola gracias. La IllegalArgumentException ha pasado usando 'file: // e:/skin.mp3' pero ahora estoy sorprendido con otro problema ' MediaException: MEDIA_INACCESSIBLE: e en javafx.scene.media.Media. (Fuente desconocida) en Gui.main (gui.java:6) ' – user1574009

+0

Documentos de JavaFX dice" Indica que se ha producido un error: aunque los medios pueden existir, no se puede acceder a ellos ", lo cual no es especialmente útil. Por lo que he leído, o bien no tiene acceso de lectura al archivo o el archivo está bloqueado por otro programa ... además de muchos otros problemas potenciales – MadProgrammer

4

Hay algunos problemas con el código en esta pregunta.

  1. La clase debe ser pública.
  2. Las aplicaciones JavaFX 2 necesitan extender la clase de Aplicación.
  3. Las aplicaciones JavaFX 2 deben definir un método de inicio.
  4. El localizador para el medio que se está creando debe ser un URI completo como lo señala MadProgrammer.

A pesar de que la pregunta tiene una etiqueta javafx-2, me pregunto si está escrito para JavaFX JavaFX Script 1.x (que ahora es un lenguaje de programación soportado e incompatible con JavaFX 2). Si es así, recomendaría la codificación en Java y el uso de JavaFX 2.x para esto en lugar de JavaFX Script.

En Windows, una representación de archivo de un localizador absoluto de un URI tiene tres barras diagonales después del protocolo de archivo.Por ejemplo, la siguiente es válido:

 
file:///C:/Users/Public/Music/skin.mp3 

Por alguna razón, una sola barra también funcionará (supongo internamente Java interpolar la // extra para el especificador de protocolo sobre los archivos o tal vez hay algo I don' Entiendo en la especificación de URL que significa que no necesita un // después del protocolo.

 
file:/C:/Users/Public/Music/skin.mp3 

Una forma de comprobar la URI archivo para algo es válido preguntarse si existe la URI archivo

 
System.out.println("File " + filename + " exists? " + new File(filename).exists()); 

Después de conocer el URI del archivo es válido, puede convertirlo en una cadena utilizando.

file.toURI().toURL().toExternalForm() 

Aquí es un ejemplo de programa corto para jugar un cierto audio en JavaFX utilizando un MediaPlayer con un poco de control de errores, por lo que es más fácil de entender si algo va mal.

import java.io.File; 
import java.net.MalformedURLException; 
import javafx.application.Application; 
import javafx.scene.Scene; 
import javafx.scene.control.Label; 
import javafx.scene.layout.StackPane; 
import javafx.scene.media.*; 
import javafx.scene.paint.Color; 
import javafx.stage.Stage; 

/** plays an audio in JavaFX 2.x */ 
public class SimpleAudioPlayer extends Application { 
    public static void main(String[] args) { launch(args); } 
    @Override public void start(Stage stage) throws MalformedURLException { 
    final Label status = new Label("Init"); 
    MediaPlayer mediaPlayer = createMediaPlayer(
     "C:/Users/Public/Music/Sample Music/Future Islands - Before the Bridge.mp3", 
     status 
    ); 
    StackPane layout = new StackPane(); 
    layout.getChildren().addAll(status); 
    stage.setScene(new Scene(layout, 600, 100, Color.CORNSILK)); 
    stage.show(); 
    if (mediaPlayer != null) { 
     mediaPlayer.play(); 
    } 
    } 

    /** 
    * creates a media player using a file from the given filename path 
    * and tracks the status of playing the file via the status label 
    */ 
    private MediaPlayer createMediaPlayer(final String filename, final Label status) throws MalformedURLException { 
    File file = new File(filename); 
    if (!file.exists()) { 
     status.setText("File does not exist: " + filename); 
    } 
    final String mediaLocation = file.toURI().toURL().toExternalForm(); 
    Media media = new Media(mediaLocation); 
    MediaPlayer mediaPlayer = new MediaPlayer(media); 
    mediaPlayer.setOnError(new Runnable() { 
     @Override public void run() { 
     status.setText("Error"); 
     } 
    }); 
    mediaPlayer.setOnPlaying(new Runnable() { 
     @Override public void run() { 
     status.setText("Playing: " + mediaLocation); 
     } 
    }); 
    mediaPlayer.setOnEndOfMedia(new Runnable() { 
     @Override public void run() { 
     status.setText("Done"); 
     } 
    }); 
    return mediaPlayer; 
    } 
} 

Aquí hay un enlace a un ejemplo adicional de un reproductor multimedia JavaFX 2.x, que plays all of the mp3 files in a given directory sequentially.

+0

bueno, está funcionando ... ¡gracias! –

Cuestiones relacionadas