You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Java命令行界面播放音频并实现空格键暂停重播功能?

在Java命令行界面播放音频并实现暂停/重播功能

没问题!我来帮你搞定这个需求。在命令行环境下用Java播放音频,核心是用Java自带的*javax.sound.sampled包*(不需要额外依赖),同时要单独开一个线程监听键盘输入——毕竟命令行没有GUI那种现成的按键事件机制,得自己轮询处理。

核心思路拆解

  1. 音频播放控制:用Clip类来管理音频,它天生支持暂停、重启、定位到起始位置这些操作,完美契合你的需求。
  2. 命令行按键监听:因为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状态导致的异常。

测试步骤

  1. 把代码中的your-audio-file.wav替换成你实际的音频文件路径。
  2. 在TextPad中编译并运行这个程序。
  3. 按空格键可以切换暂停/重播,按q键退出程序。

内容的提问来源于stack exchange,提问作者Muhd Ikmal Asraf

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 21:42:39