一、JavaSound的體系結構
當前JDK的JavaSound API隨同Java媒體框架(JMF,Java Media Framework)一起發布,主頁在java.sun.com/PRodUCts/java-media/jmf/,適合JDK 1.1以及更高的版本。除了JDK實現的JavaSound API之外,還有一個源代碼開放的JavaSound實現是Tritonus,主頁在http://www.tritonus.org/。
圖一描述了JavaSound API的體系結構,虛線表示Sun的JavaSound標準定義的API調用。上面一根虛線表示我們編寫音頻處理程序要調用的API,JavaSound API包含在javax.sound.sampled和javax.sound.midi包中。兩根虛線之間的部分就是JavaSound API的具體實現。

圖一:JavaSound體系結構
就象上面一根虛線表示的API具有統一標準一樣,在所有的JavaSound實現中,圖一下面一根虛線表示的SPI(服務提供者接口, Service Provider Interface)也是統一的。SPI的作用是以插件(Plug-In)的形式提供自定義的擴展模塊,我們只要提供與SPI兼容的插件擴展模塊,就可以在不改變API的情況下擴展音頻處理程序的能力。SPI包含在java.sound.sampled.spi和javax.sound.midi.spi包中。
例如,假設有一個只能播放WAV文件的程序,我們只要增加一個支持MP3文件解碼的插件模塊,就可以在不改動播放程序的任何一行代碼的前提下,為這個播放程序添加播放MP3的能力。
二、JavaSound混頻原理圖二闡述了JavaSound的混頻器原理。在處理輸入音頻的應用中,對于來自各種音頻輸入端口的信號,例如麥克風、CD播放器、磁帶播放器,等等,我們可以在它們到達TargetDataLine之前,利用混頻器控制輸入混頻,最后在程序中通過TargetDataLine獲得數字化的音頻輸入流。

類似地,在處理輸出音頻的應用中,混頻器用來對一系列來自SourceDataLine的數據進行混頻處理,經處理后的信號可輸出到各種輸出端口,例如揚聲器、耳機等。SourceDataLine是一個可寫入音頻信號數字流的設備,例如,我們可以從一個WAV文件讀取內容寫入到SourceDataLine,然后再通過揚聲器輸出。
輸入到混頻器的信號可以來源于剪輯。剪輯(Clip)是一個包含一段完整音頻數據流的設備,或者說,剪輯就是一個緩沖在內存中的完整音頻數據流。在一些要求反復播放音樂片段的場合,例如游戲的背景音樂,剪輯是很有用的。
圖三描述了JavaSound API中一些常用的類、接口及其關系,所有圖三顯示的類、接口都通過Line這個基本接口統一起來。Line接口用來關閉/打開設備、注冊事件監聽器,以及提供一些用來調整聲音效果的對象,例如調整音量大小的對象。AudioSystem在JavaSound體系中起著一個工廠(Factory)類的作用,提供了一系列的靜態方法,我們通過這些靜態方法來獲取JavaSound系統默認配置的資源(所謂靜態方法,就是可以在不創建AudioSystem實例的情況下直接調用的方法)。

新聞熱點
疑難解答