5

我知道这是一个重复的问题。在此处此处查看原始版本。

所以我的代码只是复制粘贴:

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)

我正在编译并正确运行它,即通过将jfxrt.jar文件包含在类路径中

注意:我只是使用记事本而不是任何 IDE。

所以谁能告诉我原因IllegalArgumentException

谢谢

更新:通过使用file://e:/skin.mp3它工作正常,但给我留下了另一个例外:

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

因此,如果您可以对这个例外有所了解。

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

4

2 回答 2

5

来自 JavaFX API 文档

  • 提供的 URI 必须符合 java.net.URI 要求的 RFC-2396。
  • 仅支持 HTTP、FILE 和 JAR URI。

因此,我怀疑通过阅读文档,您需要提供 URI 路径。

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

于 2012-08-27T04:04:58.523 回答
4

这个问题的代码有一些问题。

  1. 课程需要公开。
  2. JavaFX 2 应用程序需要扩展 Application 类。
  3. JavaFX 2 应用程序应该定义一个启动方法。
  4. 正在创建的媒体的定位器应该是 MadProgrammer 指出的完整 URI。

即使这个问题有一个 javafx-2 标记,我想知道它是否是为 JavaFX 1.x JavaFX Script(现在是一种不受支持的编程语言并且与 JavaFX 2 不兼容)编写的。如果是这样,我建议使用 Java 编码并为此使用 JavaFX 2.x 而不是 JavaFX Script。

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

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

出于某种原因,一个斜杠也可以工作(我猜在内部 Java 会为文件上的协议说明符插入额外的 // 或者可能在 URL 规范中有一些我不理解的东西,这意味着你不需要// 在协议之后)。

文件:/C:/Users/Public/Music/skin.mp3

检查文件 uri 的一种方法是询问文件 uri 是否存在

System.out.println("文件" + 文件名 + " 存在吗?" + new File(filename).exists()); 

在您知道您的文件 uri 有效后,您可以使用将其转换为字符串。

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

这是一个简短的示例程序,用于在 JavaFX 中使用带有一点错误处理的 MediaPlayer 播放一些音频,以便在出现问题时更容易理解。

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

这是一个指向 JavaFX 2.x 媒体播放器的附加示例的链接,该播放器按顺序播放给定目录中的所有 mp3 文件

于 2012-08-27T17:33:08.750 回答