【问题标题】:playing .mp3 file in java using notepad使用记事本在java中播放.mp3文件
【发布时间】:2012-08-21 14:14:06
【问题描述】:

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

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

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 中播放得很好。

【问题讨论】:

  • “没有损坏,因为它在 vlc 中运行良好。” 哈哈!媒体播放器竭尽全力确保他们可以播放几乎所有扔给他们的垃圾文件。如果您需要确认文件的有效性,请使用专门用于检查的程序来完成。

标签: java mp3 javafx javafx-2 illegalargumentexception


【解决方案1】:

来自 JavaFX API 文档

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

所以,我怀疑通过阅读文档,您需要提供一个 URI 路径。

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

【讨论】:

  • 要获取该 URL,您可以执行 new File("skin.mp3").toURI().toString()
  • 嘿,谢谢。 IllegalArgumentException 已经通过使用file://e:/skin.mp3 而消失了,但现在我遇到了另一个问题MediaException: MEDIA_INACCESSIBLE : e at javafx.scene.media.Media.&lt;init&gt;(Unknown Source) at Gui.main(gui.java:6)
  • JavaFX 文档说“表明发生了错误:尽管媒体可能存在,但它不可访问” - 这并不是特别有用。从我读过的内容来看,您没有对该文件的读取权限,或者该文件已被其他程序锁定...以及许多其他潜在问题
  • 媒体确实具有读取权限,因为我是 Windows 7 的管理员,并且还在许多 mp3 播放器中播放了这首歌。 (实际上我想创建自己的 mp3 播放器)。我现在应该怎么做才能解决这个问题???
  • MP3 是位于驱动器e 还是驱动器E
【解决方案2】:

这个问题的代码有几个问题。

  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 规范中有一些我不理解的东西,这意味着你不知道t 需要一个 // 在协议之后)。

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

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

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

在你知道你的文件 uri 是有效的之后,你可以将它转换成一个字符串使用。

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

这是一个简短的示例程序,用于使用 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;
  }
}

这里是指向plays all of the mp3 files in a given directory sequentially 的 JavaFX 2.x 媒体播放器的另一个示例的链接。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-30
    • 2013-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多