如何在Java命令行界面播放音频并实现空格键暂停重播功能?
在Java命令行界面播放音频并实现暂停/重播功能
没问题!我来帮你搞定这个需求。在命令行环境下用Java播放音频,核心是用Java自带的*javax.sound.sampled包*(不需要额外依赖),同时要单独开一个线程监听键盘输入——毕竟命令行没有GUI那种现成的按键事件机制,得自己轮询处理。
核心思路拆解
- 音频播放控制:用
Clip类来管理音频,它天生支持暂停、重启、定位到起始位置这些操作,完美契合你的需求。 - 命令行按键监听:因为
System.in的输入会阻塞主线程,所以要单独启动一个线程来读取键盘输入,这样不会影响音频播放的正常运行。
完整代码示例
下面是可直接运行的代码,注释里写清楚了每一步的作用:
import javax.sound.sampled.*; import java.io.File; import java.io.InputStreamReader; public class CmdAudioPlayer { private static Clip audioClip; private static boolean isPaused = false; public static void main(String[] args) { // 替换成你的WAV音频文件路径(推荐用WAV,原生支持无依赖) String audioFilePath = "your-audio-file.wav"; try { // 1. 加载并初始化音频资源 File audioFile = new File(audioFilePath); AudioInputStream audioStream = AudioSystem.getAudioInputStream(audioFile); AudioFormat format = audioStream.getFormat(); DataLine.Info info = new DataLine.Info(Clip.class, format); // 获取Clip实例并打开音频流 audioClip = (Clip) AudioSystem.getLine(info); audioClip.open(audioStream); // 2. 启动音频播放 audioClip.start(); System.out.println("🎵 音频正在播放中..."); System.out.println("按【空格键】暂停/重播,按【q键】退出程序"); // 3. 启动按键监听线程(避免阻塞主线程) Thread keyMonitorThread = new Thread(() -> { try (InputStreamReader reader = new InputStreamReader(System.in)) { int keyCode; while ((keyCode = reader.read()) != -1) { // 同步操作Clip,避免并发冲突 synchronized (audioClip) { if (keyCode == 32) { // 空格键的ASCII码是32 if (isPaused) { // 重播:回到音频起始位置再播放 audioClip.setFramePosition(0); audioClip.start(); isPaused = false; System.out.println("▶️ 音频已重播"); } else { // 暂停播放 audioClip.stop(); isPaused = true; System.out.println("⏸️ 音频已暂停"); } } else if (keyCode == 'q' || keyCode == 'Q') { // 退出程序,释放资源 audioClip.stop(); audioClip.close(); System.out.println("👋 程序已退出"); System.exit(0); } } } } catch (Exception e) { e.printStackTrace(); } }); keyMonitorThread.start(); // 监听音频播放完成事件 audioClip.addLineListener(event -> { if (event.getType() == LineEvent.Type.STOP && !isPaused) { System.out.println("🎬 音频播放完成"); } }); } catch (Exception e) { System.err.println("音频加载/播放出错:" + e.getMessage()); e.printStackTrace(); } } }
关键细节说明
- 音频格式选择:优先用WAV格式,因为
javax.sound.sampled原生支持,不需要额外引入库。如果要用MP3,需要添加MP3SPI等第三方依赖,命令行环境下会增加复杂度。 - TextPad运行注意事项:确保TextPad的控制台窗口处于激活状态,这样才能捕获你的按键输入;文件路径如果用相对路径,要放在TextPad的工作目录下(或者直接用绝对路径更稳妥)。
- 线程同步:用
synchronized(audioClip)包裹对Clip的操作,防止按键线程和音频播放线程同时修改Clip状态导致的异常。
测试步骤
- 把代码中的
your-audio-file.wav替换成你实际的音频文件路径。 - 在TextPad中编译并运行这个程序。
- 按空格键可以切换暂停/重播,按q键退出程序。
内容的提问来源于stack exchange,提问作者Muhd Ikmal Asraf
相关产品推荐
相关产品推荐

