簡體   English   中英

使用 javafx 獲取要播放的 mp3 文件

[英]Getting a mp3 file to play using javafx

我今天花了幾個小時尋找如何在 eclipse 中獲得某種形式的音頻,並且在每一步都遇到了麻煩。 目前我有一些應該可以工作的東西,但我收到一個錯誤:

線程“main”中的異常 java.lang.IllegalArgumentException:com.sun.javafx.css.parser.Css2Bin.main(Css2Bin.java:44) 處的預期文件名作為參數

我基本上是從讓它工作的人那里復制的。 我想說的是 FX 庫被添加到了它應該在的地方。 我知道這並不花哨,但我只是在嘗試基礎知識。

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

我還嘗試了許多不同的路徑名,以防萬一它不走運,我也只是嘗試通過轉到屬性(例如:/b/src/hero.mp3)來復制和粘貼我在 eclipse 中獲得的路徑名。 幫助我擺脫這個噩夢將不勝感激。

位於工作區之外的文件應包含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();
   }  
 }

如果文件在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();
} 

在此處輸入圖片說明

我懷疑您在引用嵌入式資源時遇到問題。 嵌入資源是包含在應用程序上下文中的任何文件(即,在這種情況下,存儲在應用程序 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上下文中......

JavaFX 使用 NetBeans 將 MP3 嵌入到 jar(在 jar 中)中

我在 NetBeans 中編寫了我的第一個 JavaFX 包,然后我想添加聲音,一個 mp3 音樂文件,嵌入在罐子里,罐子里,這樣我就可以把罐子通過電子郵件發送給我的朋友,音樂就可以在他們的電腦上播放. 感謝 StackOverflow 的幫助。 特別感謝那位說“把你的音樂文件放在 JAR 中,getResourceAsStream() 是你想要使用的 API”的成員。 他讓我走上了正軌,盡管我最終使用了 getResource()。 有用。

第 1 步:首先,當我在 NetBeans 中點擊運行時,我開始播放音樂。

第 2 步:我想讓音樂循環播放(重復)。 最終我做對了,感謝 StackOverflow 的成員。 請看我的源代碼。

第 3 步:最后我將 mp3 嵌入到 jar 中。 現在,這很重要。 起初音樂在我的電腦上播放,但罐子從我的硬盤上讀取它。 當我更改mp3的名稱時,jar崩潰了,它無法運行,找不到mp3。 我不得不將 mp3 嵌入到罐子中,把它放在罐子里(在罐子里),否則它不會在別人的電腦上播放。 這就是 getResource() 發揮作用的地方。

第 4 步:然后我將我的罐子通過電子郵件發送給朋友。 一些服務提供商不信任 jar,他們將電子郵件發回給我,但未送達。 其他服務提供商沒有問題並發送了電子郵件。 那么,我做了什么? 我將*.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,這是我不必要地創建的文件,因為有人這么說。 /resources 文件夾不是必需的,它保持為空。

使用 NetBeans 創建一個 Java 歸檔 (jar) 文件,如下所示:

  1. 右鍵單擊項目名稱

  2. 選擇屬性

  3. 點擊包裝

  4. 編譯后檢查 Build JAR

  5. 檢查壓縮 JAR 文件

  6. 單擊確定接受更改

  7. 右鍵單擊項目名稱

  8. 選擇清理和構建

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

  9. 單擊文件選項卡

  10. 展開 ProjectName >> dist(分布)。 jar 文件位於 dist 文件夾中。

嘗試在 VM 選項中添加--add-modules=javafx.controls,javafx.media

我試過這三行,它奏效了!

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

首先,您需要將代碼放入 try 和 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 中: String uri = new File("hero.mp3").toURI().toString();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM