【问题标题】:How to use JavaFX MediaPlayer correctly?如何正确使用 JavaFX MediaPlayer?
【发布时间】:2014-04-24 18:22:14
【问题描述】:

我正在编写一个简单的游戏并尝试播放声音,但是当我创建它抛出 IllegalArgumentException 的 Media 对象时,我无法让它工作。我不是 Java 编码员,任何帮助将不胜感激。 这是一个示例代码:

import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;

public class Main{
    public static void main(String[] args) {

        Media pick = new Media("put.mp3"); //throws here
        MediaPlayer player = new MediaPlayer(pick);
        player.play();
    }
}

显然“put.mp3”存在并位于正确的目录中,我使用以下命令检查了路径:System.out.println(System.getProperty("user.dir"));

我在这里做错了什么?

【问题讨论】:

  • 我发现文件路径应该写成“file://put.mp3”。现在我得到MediaException: MEDIA_INACCESSIBLE : put.mp3

标签: java javafx media-player media


【解决方案1】:

问题是因为您试图在 JavaFX Application thread 之外运行 JavaFX 场景图控件。

在 JavaFX 应用程序线程中运行所有 JavaFX 场景图节点。

您可以通过扩展 JavaFX Application 类并覆盖 start() 方法来启动 JavaFX 线程。

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) {

        Media pick = new Media("put.mp3"); // replace this with your own audio file
        MediaPlayer player = new MediaPlayer(pick);

        // Add a mediaView, to display the media. Its necessary !
        // This mediaView is added to a Pane
        MediaView mediaView = new MediaView(player);

        // Add to scene
        Group root = new Group(mediaView);
        Scene scene = new Scene(root, 500, 200);

        // Show the stage
        primaryStage.setTitle("Media Player");
        primaryStage.setScene(scene);
        primaryStage.show();

        // Play the media once the stage is shown
        player.play();
    }

    public static void main(String[] args) {
         launch(args);
    }
}

【讨论】:

  • 一切看起来都不错,但假设我在世界上有一个玩家角色可以将东西掉到地上,当他这样做时我显然想播放声音,问题是我是否可以反复拨打launch(Stage)?我有点希望有更好的方法。
  • PS:现在我通过将游戏中的所有 *.mp3 文件转换为 *.wav 解决了这个问题,我正在使用 java API 而不是 javaFx 来播放它们,它工作正常,但它正在成为很重。
【解决方案2】:

好的,感谢@ItachiUchiha 对此事的洞察力,我能够解决我的问题,似乎任何使用 javaFX 的代码都必须从 javaFX 应用程序线程中运行,但并非每个程序都必须使用 javaFX API。简而言之,我所做的就是从Application.start(Stage ps) 中开始我的游戏,如下所示:

import javafx.application.Application;
import javafx.stage.Stage;

public class Main extends Application {
    @Override
    public void start(Stage primaryStage) {
        new Game(9,9,BasicRobot.FACING.SOUTH, 19);
    }

    public static void main(String[] args) throws InterruptedException {
        launch();
    }
}

这样,Game 类及其创建和使用的所有内容都可以使用 javaFX。为了播放声音,我创建了一个 Utils 类:

import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;

public class Utils {

    public static void playSound(String fileName){
        Media m = new Media("file:///" + System.getProperty("user.dir").replace('\\', '/') + "/" + fileName);
        MediaPlayer player = new MediaPlayer(m);
        player.play();
    }

}

现在播放声音我所要做的就是从我的游戏中的任何地方调用Utils.playSound("fileName.mp3")

【讨论】:

    【解决方案3】:

    也许这会起作用:

    MediaMetadataRetriever mediaMetadataRetriever1 =new MediaMetadataRetriever();
    mediaMetadataRetriever1.setDataSource(getApplicationContext(), Uri.parse(myvidou_uri.toString()));
    
    
    mediaPlayer1=MediaPlayer.create(getApplicationContext(),myvidou_uri);
    mediaPlayer1.setDisplay(holder);
    textView1.setText("info\n");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多