使用 javafx 获取要播放的 mp3 文件
Posted
技术标签:
【中文标题】使用 javafx 获取要播放的 mp3 文件【英文标题】:Getting a mp3 file to play using javafx 【发布时间】:2014-08-12 09:57:44 【问题描述】:我今天花了几个小时寻找如何在 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 中获得的路径名.帮助我摆脱这个噩梦将不胜感激。
【问题讨论】:
尝试将new Media(uriString)
更改为new Media("C:\\Users\\Mike\\workspace\\b\\src\\hero.mp3");
同样的错误,第一行也未使用。
使用 Test.class.getResource("hero.mp3").toString();另外,我认为 Eclipse 喜欢将资源存储在 src 目录中,据我了解,它们应该存储在资源目录中
我是否将其分配给uristring?此外,我还尝试从 Windows C:\\Users\\Mike\\Music\\hero.mp3 中的音乐库路径
是的,String uriString = Test.class.getResource("/hero.mp3").toString();
。在文件引用的情况下,您可以简单地使用String uriString = new File("C:\\Users\\Mike\\Music\\hero.mp3").toURI().toURL().toString()
【参考方案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
上下文中...
【讨论】:
同样的错误:线程“main”中的异常 java.lang.IllegalArgumentException:预期文件名作为 com.sun.javafx.css.parser.Css2Bin.main(Css2Bin.java:44) 的参数它的路径错误?或者也许我应该卸载所有东西并清理干净? 你用/hero.mp3
代替/Kalimba.mp3
吗?
是的,上面的评论 new File("C:\\Users\\Mike\\Music\\hero.mp3").toURI().toURL().toString() 让我投掷或尝试/接住
使用,toURL
会抛出一个MalformedURLException
,这就是它的作用。我可以验证两个版本。可能是当您构建项目时,生成的 Jar 中没有包含 mp3,因为 Eclipse 不包含 src
目录中的任何内容,而是使用 resources
目录的内容来代替
@user3732441 toURI
取决于系统,很可能不符合 Media
所期望的 RFC-2396 要求【参考方案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();
【讨论】:
【参考方案3】:如果文件进入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();
【讨论】:
【参考方案4】:JavaFX 使用 NetBeans 将 MP3 嵌入到 jar(在 jar 中)
我在 NetBeans 中编写了我的第一个 JavaFX 包,然后我想在 jar 中添加声音,一个 mp3 音乐文件,嵌入到 jar 中,以便我可以通过电子邮件将 jar 发送给我的朋友,然后播放音乐在他们的电脑上。感谢 *** 的帮助。特别感谢说“将你的音乐文件放入 JAR,getResourceAsStream() 是你想要使用的 API”的成员。他让我走上了正轨,尽管我最终使用了 getResource()。它有效。
第 1 步:首先,我在 NetBeans 中点击运行时播放音乐。
第 2 步:我想让音乐循环播放(重复)。最终我做对了,感谢 *** 的成员。请看我的源代码。
第 3 步:最后我将 mp3 嵌入到 jar 中。现在,这很重要。起初音乐在我的电脑上播放,但罐子从我的硬盘上读取了它。当我更改了 mp3 的名称时,jar 崩溃了,它无法运行,找不到 mp3。我必须将 mp3 嵌入到 jar 中,将其放入 jar 中(在 jar 中),否则它不会在其他人的计算机上播放。这就是 getResource() 发挥作用的地方。
第 4 步:然后我将我的罐子通过电子邮件发送给朋友。一些服务提供商不信任罐子,他们将电子邮件发回给我,但未送达。其他服务提供商没有问题并发送了电子邮件。那么,我做了什么?我将 *.jar 的名称更改为 *.mp4 并且电子邮件已发送,我要求我的朋友将其从 *.mp4 更改回 *.jar。它奏效了。
这是我的源代码。我确信它并不完美,但它确实有效,这要感谢 ***。
/* 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 ARchive (jar) 文件,如下所示:
右键单击项目名称
选择属性
点击打包
编译后检查 Build JAR
检查压缩 JAR 文件
单击“确定”接受更改
右键单击项目名称
选择清理并构建
JAR 文件已构建。要在 NetBeans 中查看它:
单击“文件”选项卡
展开项目名称>> dist(分布)。 jar 文件位于 dist 文件夹中。
【讨论】:
【参考方案5】:尝试在您的虚拟机选项中添加--add-modules=javafx.controls,javafx.media
。
【讨论】:
【参考方案6】:首先您需要将代码放入 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();
【讨论】:
OP 使用的是 JavaFX,而不是 Swing。这个问题也有 6 年历史,并且有多个其他答案已经解决了这个问题 您的回答并没有给这个(旧)问题带来任何新的东西。此外,正如your question here 所表明的那样,您发布的代码甚至无法正常工作。【参考方案7】:我尝试了这三行,它成功了!
Media sound = new Media(new File("src/music/menu.mp3").toURI().toString());
MediaPlayer player = new MediaPlayer(sound);
player.play();
【讨论】:
以上是关于使用 javafx 获取要播放的 mp3 文件的主要内容,如果未能解决你的问题,请参考以下文章