使用javafx获取mp3文件

时间:2014-06-22 02:36:50

标签: java eclipse javafx pathname

我今天花了好几个小时来查看如何在eclipse中获取某种形式的音频,并且在每一步都遇到了麻烦。目前我有一些应该工作,但我收到一个错误:

线程中的异常" main" java.lang.IllegalArgumentException:期望的文件名作为参数     在com.sun.javafx.css.parser.Css2Bin.main(Css2Bin.java:44)

我基本上是从那个有它工作的人那里复制过来的。我想说FX lib应该添加到应有的位置。我知道这不是很奇特,但我只是尝试了基础知识。

package b;
import java.io.File;
import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;
public class test {

    public static void main(String[] args){
    String uriString = new File("C:\\Users\\Mike\\workspace\\b\\src\\hero.mp3").toURI().toString()
    MediaPlayer player = new MediaPlayer( new Media(uriString));
    player.play();
}}

我还尝试了许多不同的路径名,以防万一没有运气,我也只是尝试通过转到属性ex:/b/src/hero.mp3来复制并粘贴我在eclipse中获得的路径名。 。我将不胜感激,让我摆脱这场噩梦。

7 个答案:

答案 0 :(得分:2)

位于工作区外的文件应包含file://前缀。一个演示功能的简单示例是

public class Reproductor extends Application {

    public static void main(String[] args) {
        launch(args); 
    }

   @Override
   public void start(Stage stage) throws Exception {
       Media media = new Media("file:///Movies/test.mp3"); //replace /Movies/test.mp3 with your file
       MediaPlayer player = new MediaPlayer(media); 
       player.play();
   }  
 }

答案 1 :(得分:1)

我怀疑您在引用嵌入资源时遇到问题。嵌入式资源是应用程序上下文中包含的任何文件(即,在这种情况下,存储在应用程序Jar中)。

为了获得对这些资源的引用,您需要使用Class#getResource,它返回URL,然后您可以根据需要使用它来加载资源,例如..

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) {
        String path = Test.class.getResource("/Kalimba.mp3").toString();
        Media media = new Media(path);
        MediaPlayer mp = new MediaPlayer(media);
        mp.play();

        System.out.println("Playing...");
    }

    public static void main(String[] args) {
        launch(args);
    }

}

现在,在我处理Application上下文...

之前,我无法让它工作

答案 2 :(得分:1)

JavaFX使用NetBeans将一个MP3嵌入jar(在jar中)

我在NetBeans中编写了我的第一个JavaFX包,然后我想在jar中添加声音,一个嵌入jar中的mp3音乐文件,以便我可以将jar发送给我的朋友,音乐会播放在他们的电脑上。感谢StackOverflow的帮助。特别感谢那位说“把你的音乐文件放在JAR中的成员,getResourceAsStream()是你想要使用的API。”他让我走上正轨,尽管我最终使用了getResource()。它有效。

第1步:首先,当我在NetBeans中运行时,我得到了音乐。

第2步:我希望音乐循环(重复)。最后,由于StackOverflow的成员,我做对了。请参阅我的源代码。

第3步:最后我将jar转到EMBED中。现在,这很重要。起初音乐在我的电脑上播放,但是罐子从我的硬盘上读出来。当我更改mp3的名称,然后jar崩溃,它不会运行,它找不到MP3。我不得不将mp3嵌入jar中,将其放入jar中(在jar中),否则它将无法在别人的计算机上播放。这就是getResource()的诀窍。

第4步:然后我将我的罐子通过电子邮件发送给朋友。有些服务提供商不信任罐子,他们将电子邮件发回给我,未送达。其他服务提供商没有问题并发送电子邮件。那么,我做了什么?我将* .jar的名称更改为* .mp4并且已发送电子邮件,我要求我的朋友将其从* .mp4更改为* .jar。有效。

这是我的源代码。我确信它并不完美,但它的确有效,感谢StackOverflow。

 /* Of course, one needs to import the following gizmo’s (and others): */
    import javafx.util.Duration;  
    import javafx.scene.media.Media;  
    import javafx.scene.media.MediaPlayer; 

    /* I want to EMBED the music inside the jar (in the jar).
     The secret seems to be getResource. The source code starts here,
     to EMBED the sound (DollyParton.mp3) into the jar: */

//************************ begin the music ***********************

    @Override public void start(Stage primaryStage) throws Exception {
        init(primaryStage);
        primaryStage.show();
        play();
    }

    public static void main(String[] args) {
        launch(args);
    }
        MediaPlayer musicplayer; {

    /* Put your music file IN THE JAR, "getResourceAsStream()" is
    the API you want to use. Put the DollyParton.mp3 into the Windows
    folder src/rockymountain. NetBeans automatically copies the mp3
    to the folder build/classes/rockymountain. */

        Media mp3MusicFile = new Media(getClass().getResource("DollyParton.mp3").toExternalForm()); 

        musicplayer = new MediaPlayer(mp3MusicFile);
        musicplayer.setAutoPlay(true);
        musicplayer.setVolume(0.9);   // from 0 to 1      

        //***************** loop (repeat) the music  ******************
        musicplayer.setOnEndOfMedia(new Runnable() {    
        public void run() {
        musicplayer.seek(Duration.ZERO); 
       }
         });  
      //*************** end of loop (repeat) the music  **************

    }

//**************************** end of music *************************

我将mp3放入Windows文件夹src / rockymountain中。然后NetBeans自动将mp3复制到文件夹build / classes / rockymountain。 NetBeans不会将mp3复制到文件夹/资源,这是我不必要地创建的文件,因为有人这么说。不需要/ resources文件夹,它仍为空。

使用NetBeans创建Java ARchive(jar)文件,如下所示:

  1. 右键单击项目名称

  2. 选择属性

  3. 点击包装

  4. 编译后检查构建JAR

  5. 检查压缩JAR文件

  6. 单击“确定”接受更改

  7. 右键单击项目名称

  8. 选择清洁和构建

    构建JAR文件。要在NetBeans中查看它:

  9. 单击“文件”选项卡

  10. 展开ProjectName>> dist(分布)。 jar文件位于dist文件夹中。

答案 3 :(得分:0)

如果文件在resources/music中,这将起作用,应用程序将可移植,.mp3 inside the .jar

Media media = null;
try {
  media = new Media(getClass().getResource("/music/hero.mp3").toURI().toString());
} catch (URISyntaxException e) {
  e.printStackTrace();
} 

enter image description here

答案 4 :(得分:0)

尝试在您的VM选项中添加--add-modules=javafx.controls,javafx.media

答案 5 :(得分:0)

我尝试了这三行,它奏效了!

   Media sound = new Media(new File("src/music/menu.mp3").toURI().toString());
   MediaPlayer player = new MediaPlayer(sound);
   player.play();

答案 6 :(得分:-2)

首先,您需要将代码放入try and catch以捕获任何错误,其次,您必须 定义JFXPanel以将其定义到媒体包和工具包中,因此代码如下:

package test1;

import java.io.File;
import javafx.scene.media.Media;
import javax.swing.JOptionPane;
import javafx.scene.media.MediaPlayer;
import javafx.embed.swing.JFXPanel;

public static void main(String[] args) {

    try {
        JFXPanel j = new JFXPanel();
        String uriString = new File(""C:\\Users\\Mike\\workspace\\b\\src\\hero.mp3"").toURI().toString();
        MediaPlayer Player = new MediaPlayer(new Media(uriString));
        Player.play();

    } catch (Exception ex) {
        JOptionPane.showMessageDialog(null, ex);
    }
}

一个很好的信息,您只能输入文件名 在File()exp内部:字符串uri = new File(“ hero.mp3”)。toURI()。toString();