| 方法 | 用途 |
play() | 播放一次 |
loop() | 循環播放 |
stop() | 停止播放 |
取得 AudioClip 實例
透過 Applet 類別的方法:
getAudioClip(URL url)
getAudioClip(URL url, String name)
getCodeBase() 取得 Applet 程式碼基底 URL,配合相對路徑載入聲音檔。
支援格式與轉檔建議
- Java 僅原生支援 .au (Sun AU 格式,8-bit μ-law, 8kHz 單聲道)
- Windows 常用 .wav,需轉檔工具 (如
sox、GoldWave、Audacity) 轉為 .au
- 轉檔指令範例:
sox input.wav -c 1 -r 8000 -u -b output.au
完整範例:循環播放背景音樂
SoundDemo.java
import java.awt.*;
import java.applet.*;
public class SoundDemo extends Applet {
public void paint(Graphics g) {
// 載入聲音檔 (相對於 CodeBase)
AudioClip audioClip = getAudioClip(getCodeBase(), "Sample.au");
g.drawString("Sound Demo!", 5, 15);
audioClip.loop(); // 循環播放
}
}
SoundDemo.html
<HTML>
<TITLE>SoundDemo Applet</TITLE>
<APPLET CODE="SoundDemo.class" WIDTH=300 HEIGHT=200>
</APPLET>
</HTML>
生命週期管理最佳實踐
在 paint() 中載入播放有缺陷:每次重繪重新載入。正確做法:
public class SoundDemo extends Applet {
private AudioClip backgroundMusic;
public void init() {
backgroundMusic = getAudioClip(getCodeBase(), "background.au");
}
public void start() {
if (backgroundMusic != null) backgroundMusic.loop();
}
public void stop() {
if (backgroundMusic != null) backgroundMusic.stop();
}
public void destroy() {
// Applet 銷毀時資源會自動釋放
}
public void paint(Graphics g) {
g.drawString("Sound Demo - Music Playing", 5, 15);
}
}
進階控制:播放音效 (非循環)
private AudioClip clickSound;
public void init() {
clickSound = getAudioClip(getCodeBase(), "click.au");
}
public void playClick() {
if (clickSound != null) clickSound.play(); // 非阻塞、可疊加
}
常見問題與解決
| 問題 | 原因 | 解決 |
| 無聲音/報錯 | 檔案非 .au 格式、路徑錯誤、檔案損壞 | 確認副檔名 .au、用 sox 轉檔、檢查 getCodeBase() 路徑 |
| 循環播放無法停止 | 未在 stop()/destroy() 呼叫 stop() | 生命週期方法中正確管理 |
| 多個音效疊加衝突 | 單一 AudioClip 不支援混音 | 每個音效用獨立 AudioClip 實例 |
| 網路載入延遲 | 大檔案下載慢 | 預載入 (init)、壓縮檔案、考慮 MIDI 替代 |
現代替代方案 (Applet 已淘汰)
- JavaFX:
MediaPlayer/AudioClip 支援 MP3、WAV、AIFF 等現代格式
- Java Sound API:
javax.sound.sampled 低層級控制 (Clip、SourceDataLine、Mixer)
- Web 端:HTML5
<audio>、Web Audio API
- 上一篇文章: 利用 Observer 模式實現組件鬆耦合通信
- 下一篇文章: Java 資料庫存取技術演進全景:JDBC、EJB、JDO、Hibernate 與第三方 ORM 深度比較
Copyright ©
程式碼之家 All Rights Reserved