首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 程式設計入門

Java 音頻播放完整方案:javax.sound.sampled 低層與 sun.audio 簡易封裝

     編輯:Java 程式設計入門

方案一:標準 API javax.sound.sampled(推薦)

支援 WAV、AIFF、AU 等非壓縮格式;MP3 需外掛 SPI(如 JLayer、Tritonus)。

public class AudioPlayer extends Thread {
    private final String filePath;

    public AudioPlayer(String path) { this.filePath = path; }

    @Override public void run() {
        try (AudioInputStream ais = AudioSystem.getAudioInputStream(new File(filePath))) {
            AudioFormat fmt = ais.getFormat();
            DataLine.Info info = new DataLine.Info(SourceDataLine.class, fmt);
            try (SourceDataLine line = (SourceDataLine) AudioSystem.getLine(info)) {
                line.open(fmt);
                line.start();
                byte[] buf = new byte[4096];
                int n;
                while ((n = ais.read(buf)) != -1) line.write(buf, 0, n);
                line.drain();
            }
        } catch (Exception e) { e.printStackTrace(); }
    }
}
// 使用:new AudioPlayer("sound.wav").start();

方案二:sun.audio 簡易封裝(內部 API,不保證長期相容)

public class MusicPlay {
    private AudioStream as;
    private ContinuousAudioDataStream loop;

    public MusicPlay(URL url) {
        try { as = new AudioStream(url.openStream()); } catch (IOException e) { e.printStackTrace(); }
    }
    public void start() { if (as != null) AudioPlayer.player.start(as); }
    public void stop()  { if (as != null) AudioPlayer.player.stop(as); }
    public void loopStart() {
        try { loop = new ContinuousAudioDataStream(as.getData()); AudioPlayer.player.start(loop); }
        catch (IOException e) { e.printStackTrace(); }
    }
    public void loopStop() { if (loop != null) AudioPlayer.player.stop(loop); }
}

關鍵差異對比

特性javax.sound.sampledsun.audio
模組標準模組 java.desktopJDK 內部 sun.*
格式支援WAV/AIFF/AU + SPI 擴展僅 AU/WAV 部分
控制精度緩衝區、增益、聲像全控制僅播放/停止/循環
長期相容保證可能移除(JDK 9+ 模組化)

生產級建議

  • 短音效(UI 點擊、提示):預載 Clip,clip.setFramePosition(0); clip.start();
  • 長音樂/背景音:SourceDataLine 串流播放,避免佔用大量堆記憶體
  • MP3/OGG:引入 JLayer (MP3SPI) 或 Tritonus,或使用 JavaFX MediaPlayer(含解碼器)
  • 多執行緒安全:Clip/SourceDataLine 非執行緒安全,單執行緒操作或加鎖

JavaFX MediaPlayer 範例(現代首選)

Media media = new Media(new File("song.mp3").toURI().toString());
MediaPlayer player = new MediaPlayer(media);
player.setOnReady(() -> player.play());
player.setCycleCount(MediaPlayer.INDEFINITE); // 循環
// JavaFX 需獨立模組 java.media,JDK 11+ 需額外引入
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved