Java 對聲音的支持經歷了從簡單到豐富的演變。早期僅支援 8kHz μ-law AU 格式,JDK 1.2+ 增加 AIFF、WAV、MIDI 多格式支援。本文梳理兩大核心場景的基礎用法。
核心類:java.applet.AudioClip,提供三大方法:
play():播放一次loop():循環播放stop():停止播放// 1. Applet 實例方法(僅 Applet 內可用)
AudioClip clip = getAudioClip(getCodeBase(), "sound.au");
// 或
AudioClip clip = getAudioClip(getDocumentBase(), "sound.au");
// 2. Java 2 新增靜態方法(Application 也可用)
AudioClip clip = Applet.newAudioClip(new URL("file:/path/sound.au"));
getCodeBase() 返回 Applet 所在 URL,getDocumentBase() 返回嵌入頁面 URL。
import java.applet.*;
import java.awt.event.*;
public class SoundApplet extends Applet implements MouseListener {
AudioClip audio;
public void init() {
audio = getAudioClip(getDocumentBase(), "flute+hrn+mrmba.au");
addMouseListener(this);
}
public void mousePressed(MouseEvent e) {
if (audio != null) audio.play(); // 點擊播放
}
// 其他 MouseListener 方法留空...
}
注意:JDK 1.0 事件模型 mouseDown() 已棄用,請統一使用 MouseListener + mousePressed()。
Application 無 AudioClip,Sun 提供 sun.audio 非標準包作為過渡方案:
import sun.audio.*;
import java.io.*;
public class SoundApp {
public static void main(String[] args) {
try {
FileInputStream fis = new FileInputStream("sloop.au");
AudioStream as = new AudioStream(fis);
AudioPlayer.player.start(as); // 全局單例播放器
// AudioPlayer.player.stop(as); // 停止
} catch (Exception e) { e.printStackTrace(); }
}
}
核心類:
AudioStream:封裝 InputStream 的聲音流AudioPlayer.player:全局播放器單例,start/stop 控制播放JDK 1.3+ 引入標準化 javax.sound.sampled,功能遠超上述方案:
核心包結構:
javax.sound.sampled // 數字音頻:Clip, SourceDataLine, TargetDataLine, Mixer, AudioSystem
javax.sound.midi // MIDI:Sequencer, Synthesizer, Receiver, Transmitter, MidiSystem
javax.sound.sampled.spi // 音頻 SPI
javax.sound.midi.spi // MIDI SPI
| 格式 | 擴展名 | 特點 | 支援版本 |
|---|---|---|---|
| AU | .au, .snd | Sun/Unix 標準,μ-law/PCM | JDK 1.0+ |
| WAV | .wav | Microsoft/IBM,PCM 為主 | JDK 1.2+ |
| AIFF | .aif, .aiff | Mac/SGI 標準,支援壓縮 | JDK 1.2+ |
| MIDI Type 0 | .mid | 單軌道,所有樂器合併 | JDK 1.2+ |
| MIDI Type 1 | .mid | 多軌道,樂器分離 | JDK 1.2+ |
| RMF | .rmf | Beatnik 混合格式,MIDI+採樣+版權 | Java Sound 1.0+ |
javax.sound.sampled/midi,功能完整、標準化、長期維護。AudioClip 簡單播放場景可保留;sun.audio 屬內部 API,務必遷移至標準 API。Java 聲音技術從「會發聲」走向「專業級音頻處理」,掌握標準 API 即掌握了跨平台多媒體開發的核心鑰匙。