[英]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();
}
}
我懷疑您在引用嵌入式資源時遇到問題。 嵌入資源是包含在應用程序上下文中的任何文件(即,在這種情況下,存儲在應用程序 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) 文件,如下所示:
右鍵單擊項目名稱
選擇屬性
點擊包裝
編譯后檢查 Build JAR
檢查壓縮 JAR 文件
單擊確定接受更改
右鍵單擊項目名稱
選擇清理和構建
JAR 文件已構建。 要在 NetBeans 中查看它:
單擊文件選項卡
展開 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.