【问题标题】:JavaFX MediaPlayer switches to state PLAYING, but doesn't play mp3JavaFX MediaPlayer 切换到 PLAYING 状态,但不播放 mp3
【发布时间】:2017-11-26 13:06:40
【问题描述】:

我正在尝试使用 JavaFX MediaPlayer 播放 mp3 文件。它加载文件并切换到 PLAYING 状态而没有任何错误,但它不播放文件并且 currentTimeProperty 也没有改变。我做错了什么?

public class Test extends Application {

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

    @Override
    public void start(Stage primaryStage) throws Exception {
        MediaPlayer player = new MediaPlayer(new Media(
                new File("sounds/sound.mp3").toURI().toString()
        ));

        Button btn = new Button("Play");
        btn.setOnAction(event -> player.play());
        VBox pane = new VBox(10, btn);
        pane.setAlignment(Pos.CENTER);
        Scene scene = new Scene(pane, 100, 100);
        primaryStage.setScene(scene);
        primaryStage.show();
    }
}

【问题讨论】:

    标签: javafx mp3 media-player


    【解决方案1】:

    您提供的代码对我来说可以正常工作。我不是 MediaPlayer 和 MediaView 类的专家,但假设您正确加载媒体并且在加载 mp3 文件时没有得到MediaException: MEDIA_UNAVAILABLE,有您的问题的两个可能原因。

    • 不支持您的文件格式。查看 Java Doc 关于 supported formats 你会看到支持的 mp3 格式 是:原始 MPEG-1、2 和 2.5 音频;第一层、第二层和第三层;全部 支持的采样频率和比特率组合。因此,如果 您的文件不受支持,您将无法播放。轮到你了 可以使用下面的代码检查是否有任何错误。

    player.setOnError(() -> System.out.println("Error : " + player.getError().toString()));

    • 过去我在使用新的 Windows 操作系统时遇到过类似的问题。如果您使用的是 Windows,您的操作系统可能没有必要的编解码器来播放视频/音频。这样,您的 JavaFX 应用程序将尝试播放音频,但您不会听到任何声音。要解决这个问题,您可以尝试安装一些我不熟悉的音频编解码器,但我建议使用 K-Lite 编解码器包(进行谷歌搜索,你会没事的)

    【讨论】:

    • 非常感谢!显然 JavaFX MediaPlayer 无法处理 MPEG ADTS。我使用 AAC 编码将文件转换为 m4a,这就像一个魅力。
    【解决方案2】:

    我想你忘了一部分试试这个

    public static void main(String[] args) {
        launch(args);
    }
    
    @Override
    public void start(Stage primaryStage) throws Exception {
        MediaPlayer player = new MediaPlayer(new Media(
                new File("sounds/sound.mp3").toURI().toString()
        ));
    
        Button btn = new Button("Play");
        btn.setOnAction(event -> player.play());
        VBox pane = new VBox(10, btn);
        pane.setAlignment(Pos.CENTER);
        Scene scene = new Scene(pane, 100, 100);
    
        MediaView mediaView = new MediaView(player);
        ((Group)scene.getRoot()).getChildren().add(mediaView);
    
        primaryStage.setScene(scene);
        primaryStage.show();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-25
      • 1970-01-01
      • 2015-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多