使用记事本在java中播放.mp3文件

使用记事本在java中播放.mp3文件,java,mp3,javafx,javafx-2,illegalargumentexception,Java,Mp3,Javafx,Javafx 2,Illegalargumentexception,我知道这是一个重复的问题。 检查原始的一个或多个 因此,我的代码只是复制粘贴: import javafx.scene.media.*; class Gui { public static void main(String[] args) { try{ Media hit = new Media("skin.mp3"); MediaPlayer mediaPlayer = new MediaPlayer(hit); mediaPlay

我知道这是一个重复的问题。 检查原始的一个或多个

因此,我的代码只是复制粘贴:

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();
    }
  }
}
我得到的例外是:

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)
如果你能解释一下这个例外


顺便说一下,我检查了这首歌,它没有损坏,因为它在vlc中播放得很好。

来自JavaFXAPI文档

  • 根据java.net.URI的要求,提供的URI必须符合RFC-2396
  • 仅支持HTTP、文件和JAR URI
因此,我怀疑从阅读文档中,您需要提供一个URI路径


类似于
file://path/to/file/skin.mp3
可能会起作用。

此问题中的代码存在一些问题

  • 这门课需要公开
  • JavaFX2应用程序需要扩展应用程序类
  • JavaFX2应用程序应该定义一个启动方法
  • 正在创建的媒体的定位器应该是一个完整的URI,如程序员所述
  • 尽管这个问题有一个javafx-2标记,但我想知道它是否是为javafx1.xjavafx脚本编写的(它现在是一种不受支持的编程语言,与javafx2不兼容)。如果是这样,我建议使用Java编码并使用JavaFX2.x,而不是JavaFX脚本

    在Windows上,URI绝对定位器的文件表示在文件协议后有三个斜杠。例如,以下内容是有效的:

    file:///C:/Users/Public/Music/skin.mp3 下面是一个简短的示例程序,使用MediaPlayer在JavaFX中播放一些音频,并进行一些错误处理,以便在出现问题时更容易理解

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

    这里有一个指向JavaFX2.x媒体播放器的附加示例的链接。

    要获取该URL,您可以执行
    新建文件(“skin.mp3”).toURI().toString()
    嘿,谢谢。IllegalArgumentException是通过使用
    文件://e:/skin.mp3
    实现的,但现在我遇到了另一个问题
    MediaException:MEDIA\u unaccessible:e在javafx.scene.MEDIA.MEDIA。(未知源代码)在Gui.main(Gui.java:6)
    javafx文档说表示发生错误:虽然媒体可能存在,但无法访问“-这不是特别有用。据我所知,您没有对该文件的读取权限,或者该文件被其他程序锁定……再加上许多其他潜在问题,媒体确实具有读取权限,因为我是windows 7的管理员,并且在许多mp3播放器中播放了这首歌。(实际上,我想创建自己的mp3播放器)。我现在应该怎么做才能解决这个问题???MP3是否位于驱动器
    e
    或驱动器
    e
    ?“没有损坏,因为它在vlc中播放得很好。”哈哈!媒体播放器竭尽全力确保他们可以播放几乎任何扔给他们的垃圾文件。如果需要确认文件的有效性,请使用设计用于检查的程序进行确认。 file:/C:/Users/Public/Music/skin.mp3 System.out.println("File " + filename + " exists? " + new File(filename).exists());
    file.toURI().toURL().toExternalForm()
    
    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;
      }
    }