• JavaFx学习问题2--音频、视频播放失败情况


    一、路径注意事项:

    完整代码如下:

    import javafx.application.Application;
    import javafx.geometry.Pos;
    import javafx.scene.Scene;
    import javafx.scene.control.Button;
    import javafx.scene.image.Image;
    import javafx.scene.image.ImageView;
    import javafx.scene.layout.BorderPane;
    import javafx.scene.layout.GridPane;
    import javafx.scene.media.Media;
    import javafx.scene.media.MediaPlayer;
    import javafx.stage.Stage;
    import java.io.IOException;
    import java.net.URI;
    import java.nio.file.*;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Random;
    
    
    public class Main extends Application {
    
    
        @Override
        public void start(Stage primaryStage) throws Exception{
    
    
            primaryStage.setTitle("BA怪叫器雏形版");
    
            // 创建上下两个部分的布局
            BorderPane borderPane = new BorderPane();
    
            // 上部分用于展示图片的ImageView,放置在一个StackPane中
    
            ImageView imageView = new ImageView();
            imageView.setFitWidth(300); // 宽度占30%
            imageView.setFitHeight(300); // 高度占80%
    
            borderPane.setCenter(imageView);
    
            // 下部分用于放置按钮的GridPane
            GridPane gridPane = new GridPane();
            gridPane.setAlignment(Pos.CENTER);
            gridPane.setHgap(15);
            gridPane.setVgap(20);
    
            // 创建9个带图片的按钮,并指定不同的图片和音频
            for (int i = 0; i < 15; i++) {
                Button button = createImageButton(i,imageView);
                int row = i / 5;
                int col = i % 5;
                gridPane.add(button, col, row);
            }
            borderPane.setBottom(gridPane);
    
            // 创建场景并显示
            Scene scene = new Scene(borderPane, 600, 700);
            primaryStage.setScene(scene);
            primaryStage.getIcons().add(new Image("/img/cover.jpg"));
            primaryStage.show();
        }
    
        // 创建带图片的按钮,并添加事件处理程序
        private Button createImageButton(int index,ImageView mainImage) {
            String[] imagePaths = {
                    "/img/fox.jpg", "/img/xiaotao1.png", "/img/xingye.jpg","/img/fox.jpg",
                    "/img/fox.jpg", "/img/fox.jpg", "/img/fox.jpg","/img/fox.jpg",
                    "/img/fox.jpg", "/img/fox.jpg", "/img/fox.jpg","/img/fox.jpg",
                    "/img/fox.jpg", "/img/fox.jpg", "/img/fox.jpg","/img/fox.jpg"
            };
    
            Image image = new Image(imagePaths[index]);
            ImageView imageView = new ImageView(image);
            imageView.setFitWidth(50);
            imageView.setFitHeight(50);
    
            Button button = new Button("", imageView);
            button.setOnAction(event -> {
                String folderPath="";
                if (index==0) {
                    folderPath="/audio/fox1";
                }else if (index==1){
                    folderPath= "/audio/xiaotao";
                }else if (index==2){
                    folderPath= "/audio/xingye";
                }
                List<String> filePaths=new ArrayList<>();
    
                //这里用于调试
                String uri=getClass().getResource(folderPath).toString();
    
                try (DirectoryStream<Path> directoryStream = Files.newDirectoryStream(Paths.get(getClass().getResource(folderPath).toString().substring(6)))) {
                    for (Path path : directoryStream) {
                        if (Files.isRegularFile(path)) {
                            filePaths.add(path.toString());
                            System.out.println("文件路径: " + path.toString());
                        }
                    }
                }  catch (NoSuchFileException e) {
                    System.out.println("指定的文件夹不存在:" + e.getMessage());
                } catch (IOException e) {
                    System.out.println("无法读取文件夹: " + e.getMessage());
                }
                // 当按钮点击时,更新上部ImageView的图片
                mainImage.setImage(image);
    
                Random random=new Random();
                int audioIndex=random.nextInt(filePaths.size());
    
                // 播放MP3音频
                String audioFilePath = filePaths.get(audioIndex);
                audioFilePath = audioFilePath.replace("\\", "/");
                try {
                    URI audioUri = Paths.get(audioFilePath).toUri();
                    Media media = new Media(audioUri.toString());
                    MediaPlayer mediaPlayer = new MediaPlayer(media);
                    //添加一个setOnReady()事件监听器来确保音频文件在准备好之后再进行播放
                    mediaPlayer.setOnReady(() -> {
                        mediaPlayer.play();
                    });
                } catch (Exception e) {
                    e.printStackTrace();
                }
    
    
            });
    
            return button;
        }
    
    
    
        public static void main(String[] args) {
            launch(args);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135

    ① 用相对路径的时候别忘了前面的斜杠

    请添加图片描述
    并不是什么大问题,只是说这个细节可能会被遗漏

    ② uri问题

    在这里插入图片描述
    当时搞这个费了老劲了,搞不懂为啥是非法路径,使用getResource获取编译出来的文件夹路径会前面会出现file:/,必须把这个file:/去掉才能进行下一步文件夹下的文件读取

    二、播放不了的问题

    ① 获取的媒体文件路径本身就是不对的

    请添加图片描述

    D:\javaFX1\out\production\java\audio\fox1\audio0.wav
    
    • 1

     从directoryStream(忽略这个,只是一个特殊指代词)得到的文件路径,要注意路径里面的是斜杠还是反斜杠,合法的路径应该是/才对,要把“\”(反斜杠)换成“/”(斜杠)
     加以下这行代码就可以了audioFilePath = audioFilePath.replace("\\", "/");这里源的位置两个斜杠分别代表斜杠和转义符

    ② 必须是uri

    转换完反斜杠,播放媒体,那你大概率会遇到下面这个错误

    java.lang.UnsupportedOperationException: Unsupported protocol "xxx"
    
    • 1

     这个错误是由于尝试使用不支持的协议导致的。在JavaFX的Media类中,它接受的是一个合法的URI(Uniform Resource Identifier),而不是简单的文件路径。需要将文件路径转换为正确的URI格式,然后再传递给Media类
    在这里插入图片描述

    ③ 特殊情况

     我遇到一种奇怪的现象,打断点看路径没有问题,文件在项目里也有,但老是报not found的情况,最后发现是编译结果那里没把我项目里的文件编译出来,重新编译也没用。
    碰到这种情况,直接把整个out删掉,然后再给它一锤子(编译),看它还发不发癫
    请添加图片描述

    额外收获:

    URI和URL区别的通俗理解
    借用一句话就是: 去村子找个具体的人就是URI(这个人),如果用地址:某村多少号房子第几间房的主人 就是URL,如果用身份证号+名字 去找就是URN了

  • 相关阅读:
    JAXB:用XmlElement注解复杂类型的Java属性,来产生多层嵌套的xml元素
    虚拟机字节码执行引擎——动态类型语言支持
    前端axios发送请求,在请求头添加参数
    SpringBoot 使用JDBC
    LVS+Keepalived高可用群集
    基于SpringBoot的电影购票系统
    勒索病毒最新变种.faust勒索病毒来袭,如何恢复受感染的数据?
    ML:基于boston房价数据集利用多种线性回归算法(OLS/PLS/Lasso/Ridge)模型对比实现房价回归预测应用案例实现代码
    【从零开始学习 SystemVerilog】7.15、SystemVerilog 类—— Abstract Class(抽象类/纯方法)
    python数据分析(numpy)
  • 原文地址:https://blog.csdn.net/AsFarmer/article/details/133770031