gpt4 book ai didi

java - 我是否需要多个媒体播放器来播放多个媒体文件?

转载 作者:行者123 更新时间:2023-12-01 20:23:30 25 4
gpt4 key购买 nike

我正在使用 JavaFX 开发音乐库应用程序,但我在如何正确使用 MediaPlayer 类方面遇到了一些问题。

这是我当前设置和播放音频文件的方法:

private static MediaPlayer musicPlayer;

public static void setMedia(String path) {
try {
musicPlayer = new MediaPlayer(new Media(new File(path).toURI().toASCIIString()));
musicPlayer.play();
} catch (Exception e) {
System.out.println("invald file");
System.out.println(e.getMessage());
}
}

例如,我有两个音频文件...

file1.mp3
file2.mp3

...还有两个按钮,用于将这两个文件之一发送到上述方法:

button1.setOnAction(event -> {
setMedia("file1.mp3");
});

button2.setOnAction(event -> {
setMedia("file2.mp3");
});

通常情况下,两个音频文件会相互播放是有意义的,因为每次调用该方法时我都会创建一个新的 MediaPlayer 对象,但是,该对象是静态的。也许我误解了静态对象的工作原理,但这不应该意味着该对象只能有一个实例吗?反过来,这是否意味着每当调用 setMedia 方法时,MediaPlayer 对象的媒体都会被覆盖?

我还没有找到任何方法来“设置”或“覆盖”MediaPlayer 对象的媒体而不创建它的新实例。似乎没有办法这样做。这让我相信每个音频文件都必须有一个 MediaPlayer 对象数组。它是否正确?或者我只是在这里遗漏了一些东西?

最佳答案

I have not found any way to "set" or "overwrite" media for a MediaPlayer object without creating a new instance of it. It does not appear to have a method to do so. This leads me to believe that I must have an array of MediaPlayer objects for each audio file. Is this correct? Or am I simply missing something here?

这是正确的。 documentation for the MediaPlayer constructor明确说明了这一点:

public MediaPlayer(Media media)

Create a player for a specific media. This is the only way to associate a Media object with a MediaPlayer: once the player is created it cannot be changed.

<小时/>

Maybe I am misinterpreting how static objects work, but shouldn't it mean that there can only ever be one instance of this object?

是的,你误解了这一点。

将对 MediaPlayer 的引用设置为静态仅意味着您的类只有一个对 MediaPlayer 的引用。 (通常的说法是,单个 MediaPlayer 引用是“由类的所有实例共享”。我不喜欢这样:这意味着您必须至少拥有一个 MediaPlayer 实例类,这不是真的。将其设为静态实际上仅意味着 MediaPlayer 引用是该类的属性,而不是该类实例的属性。)只需替换该引用(以便它引用不同的 MediaPlayer)不会从堆中删除先前的对象。它仍然存在于内存中,仍然具有其所有属性等。您的类只是不再有对它的引用。

一般来说,如果一个对象没有实时引用,那么它就符合垃圾回收的条件。然而,在这种情况下,如果媒体正在播放,FX 工具包将维护对其的引用,以保持其实际物理播放。 MediaPlayer 定义了一个 dispose 方法来释放其底层资源。所以你的方法可能应该是这样的:

public static void setMedia(String path) {

if (mediaPlayer != null) {
mediaPlayer.stop();
mediaPlayer.dispose();
}
try {
musicPlayer = new MediaPlayer(new Media(new File(path).toURI().toASCIIString()));
musicPlayer.play();
} catch (Exception e) {
System.out.println("invald file");
System.out.println(e.getMessage());
}
}

几乎可以肯定,没有必要将所有内容都设为静态:它对您没有任何帮助。

关于java - 我是否需要多个媒体播放器来播放多个媒体文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44252806/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com