在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();
}