本文主要是介绍JavaFX 动态加载目录下所有WAV文件并逐个播放,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
在JavaFX中动态加载一个目录下的所有.wav
文件并逐个播放,你可以使用java.nio.file
包来遍历目录,并使用javax.sound.sampled
包来播放音频文件。不过,需要注意的是,JavaFX本身并不直接支持音频播放,但你可以使用Java的标准库来播放音频,并在JavaFX应用中同步这些操作。
以下是一个简单的步骤说明和示例代码:
- 遍历目录并获取所有
.wav
文件:使用Files.walk
或Files.newDirectoryStream
遍历指定目录,并筛选出所有.wav
文件。 - 创建音频播放器:对于每个
.wav
文件,你可以使用javax.sound.sampled.AudioInputStream
和javax.sound.sampled.SourceDataLine
来播放音频。但更常见的是使用像javax.sound.sampled.Clip
这样的高级类,它提供了更简单的API来播放音频。 - 逐个播放音频文件:在JavaFX应用中,你可能需要使用
Task
或Service
来在后台线程中播放音频,以避免阻塞UI线程。你可以使用Platform.runLater
来更新UI,以反映当前的播放状态。
下面是一个简单的示例代码,它展示了如何遍历目录并播放.wav
文件:
import javafx.application.Application;
import javafx.application.Platform;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage; import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; public class WavPlayerApp extends Application { private Label statusLabel; private ExecutorService executor = Executors.newSingleThreadExecutor(); @Override public void start(Stage primaryStage) { statusLabel = new Label("Loading..."); StackPane root = new StackPane(statusLabel); Scene scene = new Scene(root, 300, 250); primaryStage.setTitle("WAV Player"); primaryStage.setScene(scene); primaryStage.show(); playAllWavsInDirectory("path/to/your/wav/files"); // 替换为你的目录路径 } private void playAllWavsInDirectory(String directoryPath) { Path directory = Paths.get(directoryPath); try { List<Path> wavFiles = Files.walk(directory) .filter(path -> path.toString().endsWith(".wav")) .collect(java.util.stream.Collectors.toList()); playWavsSequentially(wavFiles); } catch (IOException e) { e.printStackTrace(); Platform.runLater(() -> statusLabel.setText("Error loading files")); } } private void playWavsSequentially(List<Path> wavFiles) { Runnable playNext = () -> { if (!wavFiles.isEmpty()) { Path wavFile = wavFiles.remove(0); playWav(wavFile); wavFiles.forEach(f -> System.out.println("Queued: " + f)); // 仅用于调试 wavFiles.isEmpty() ? statusLabel.setText("Playback finished") : Platform.runLater(() -> statusLabel.setText("Playing " + wavFile.getFileName())); playNext.run(); // 递归调用以播放下一个文件 } }; executor.submit(playNext); } private void playWav(Path wavFile) { try { AudioInputStream audioStream = AudioSystem.getAudioInputStream(wavFile.toFile()); Clip clip = AudioSystem.getClip(); clip.open(audioStream); clip.start(); while (!clip.isRunning()) { // 等待音频开始播放 Thread.sleep(10); } while (clip.isRunning()) { // 等待音频播放完毕 Thread.sleep(100); } clip.close(); } catch (Exception e) { e.printStackTrace(); }
这篇关于JavaFX 动态加载目录下所有WAV文件并逐个播放的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!