在BlueJ中播放mp3文件

时间:2015-11-11 22:44:21

标签: java audio

我试图在这个Stack问题答案之后在BlueJ中播放一个mp3文件: Playing .mp3 and .wav in Java?

除了文件名,我有完全相同的代码。这是我的代码:

String bip = "Johnny.mp3";
             Media hit = new Media(bip);
             MediaPlayer mediaPlayer = new MediaPlayer(hit);
             mediaPlayer.play();

我可以编译它,但是当程序试图运行它时,我得到一个例外。这是整个错误:

java.lang.IllegalArgumentException: uri.getScheme() == null! uri == 'Johnny.mp3'
at com.sun.media.jfxmedia.locator.Locator.<init>(Locator.java:211)
at javafx.scene.media.Media.<init>(Media.java:391)
at Game.goRoom(Game.java:282)
at Game.processCommand(Game.java:167)
at Game.play(Game.java:130)

就个人而言,我认为这与我给出的文件路径有关。我知道该文件存在于我的项目地图中,但我对他们想要的路径非常不确定,他们是否希望从file://一直到完整的路径,或者只是我所拥有的声音文件名称做了什么?请注意,此项目没有像Eclipse项目那样的任何资源文件夹,因为这是IDE处理文件的方式。声音文件与所有类位于同一文件夹中,因此不以任何方式排序。

我已经查过了,似乎如果这不是我的问题,那就是我的JavaFX没有被初始化。如果是这种情况,我将如何处理它以及语法如何?

2 个答案:

答案 0 :(得分:2)

Media获取String值并尝试制作URI。为什么该方法并不仅仅要求您直接传递URI(或URL),我也不知道。

documentation很好地概述了这一点......

  

构造一个Media实例。这是指定媒体的唯一方法   资源。源必须表示有效的URI并且是不可变的。只要   支持HTTP,FILE和JAR URL。如果提供的URL无效   然后会抛出异常。如果发生异步错误,则   将设置error属性。听听这家酒店的通知   任何此类错误。   
...
  约束:

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

有关URI格式的详细信息,请参阅java.net.URI   一般。 JAR URL语法在。中指定   java.net.JarURLConnection中。

     

参数:
source - 源媒体的URI。
投掷:
   - java.lang.NullPointerException - 如果URI字符串为null    - java.lang.IllegalArgumentException - 如果URI字符串没有   符合RFC-2396或(如果适用)Jar URL规范,或   是不合规的形式,不能修改为合规   form。
- java.lang.IllegalArgumentException - 如果URI字符串有   null scheme。
- java.lang.UnsupportedOperationException - 如果是   不支持为源指定的协议。
...

如果我们查看源代码,您可以看到它试图将String包装在URI类中......

public Media(@NamedArg("source") String source) {
    this.source = source;

    URI uri = null;
    try {
        // URI will throw NPE if source == null: do not catch it!
        uri = new URI(source);
    } catch(URISyntaxException use) {
        throw new IllegalArgumentException(use);
    }

因此,根据文件的实际存储位置,您可以使用类似

的内容
Media hit = new Media(new File(bip).toURI().toURL().toString());
MediaPlayer mediaPlayer = new MediaPlayer(hit);
mediaPlayer.play();

这也假设"Johnny.mp3"位于程序的当前工作目录中。

我说&#34;取决于&#34;因为你会对你的应用程序内部(捆绑)位于外部的媒体文件使用不同的方法。

在这种情况下,您可能会使用类似......

的内容
Media hit = new Media(getClass().getResource(bip).toExternalForm());
MediaPlayer mediaPlayer = new MediaPlayer(hit);
mediaPlayer.play();

答案 1 :(得分:1)

这里你去:

MediaPlayer yourPlayer = new MediaPlayer(new Media(Paths.get("yourAudioFile").toUri().toString()));

确保将文件扩展名添加到音频文件中!另外,导入以下内容:

import java.nio.file.Paths;

我假设您已导入Media和MediaPlayer类。