[英]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.