標籤:
聲音可以創造意境,觸發遐想,當與虛擬映像相結合時,更加可以讓整個世界充滿幻覺,聲音是多媒體技術的基礎。
播放聲音是Java對多媒體的支援一個重要部分,它支援的音效檔類型主要有:
AU - (副檔名為AU或SND)適用於短的音效檔。
WAV - (副檔名為WAV)由 Microsoft和 IBM共同開發,幾乎能被所有支援聲音的Windows應用程式播放。
AIFF - (副檔名為AIF或IEF)音頻互換檔案格式是為Macintosh電腦和Silicon Graphics (SGI)電腦所共用的標準音頻檔案格式。
MIDI - (副檔名為MID)樂器數位介面MIDI是為音樂製造業所認可的標準,主要用於控制諸如合成器和音效卡之類的裝置。
那麼在Java應用程式中,如何?音效檔的播放呢?
sun公司為應用程式中的聲音支援提供了一個Java包 – sun.audio,在這個包下面提供了大部分所需要的聲音處理類。
下面我們來做個播放測試:
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import sun.audio.*;
/**
* 測試聲音播放
*
* @author
*
*/
public class MusicDemo {
public static void main(String[] args) throws Exception {
// 建立音樂檔案輸入資料流對象
InputStream in = new FileInputStream("musics/flourish.mid");
// 建立音頻流對象
final AudioStream audioStream = new AudioStream(in);
new Thread(new Runnable() {
@Override
public void run() {
// 使用音頻播放器播放聲音
AudioPlayer.player.start(audioStream);
}
}).start();
Thread.sleep(3000);
// 停止聲音播放
AudioPlayer.player.stop(audioStream);
}
}
開啟擴音器,你就可以聽到聲音了,播放3秒後停止聲音的播放。
注意:
我們在Eclipse中進行代碼編寫時,可能會出現類似 “The type ‘AudioStream’ is not API” 的錯誤提示。在Eclipse中,我們可以查看到AudioStream類位於rt.jar包中的sun.audio包中。
為什麼Eclipse會提示我們 “The type ‘AudioStream’ is not API” 這鐘錯誤呢,實際上這是Eclipse的設定導致的問題。
要解決這種錯誤,我們只需要將Eclipse的設定稍微修改一下即可:在preference->java->complier->errors/warning->deprecated and restricted API 中把 Forbidden reference 的Error改成warning 即可。
根本原因如下:
J2SE中的類大致可以劃分為以下的各個包:java.*,javax.*,org.*,sun.*。除了“sun”包,其它各個包都是Java平台的標準實現,並且今後也將被繼續支援。一般說來,“sun”之類的包並不包含在Java平台的標準中,它與作業系統相關,在不同的作業系統(如Solaris,Windows,Linux,Mac等等)中的實現也各不相同,並且可能隨著J2SE版本不定期變化。因此,直接調用“sun”包的程式碼並不是100%的Java實現。
也就是說:java.*,javax.*,org.*包是作為J2SE的API公開介面的一部分,如果程式直接調用這些包中的API,那麼程式是可以運行在所有Java平台上,而與作業系統無關;但sun.*包並不是API公開介面的一部分,調用“sun”包的程式並不能確保工作在所有Java平台上,事實上,這樣的程式可能並不能工作在今後的Java平台上。
正因為如此,sun.*包中的類並沒有提供API文檔。平台無關性是Java語言最大的優勢之一,此外,SUN和Java許可證確保維持了今後API的向上相容性(以後修改的那些有嚴重bug的代碼除外)。這種相容性意味著你寫好的程式編譯成的class檔案仍然可以工作在將來的版本當中。
每家實現Java平台的廠商都可以使用他們自己的方式。sun.*包中的類是SUN 對Java平台的實現方式,它們工作在Java2 SDK的下層,這些類未必被其它Java平台開發商支援。比如你的Java程式如果調用了一個名為“sun.package.Foo”的類,將有可能產生“ClassNotFoundError”的錯誤,同時你也將失去利用Java的一個主要的優點。
從技術上講,並不能防止你的程式調用sun.*包中的類。在版本的變遷當中,這些類可能會被刪除或轉移到其它包路徑下,而且它的介面(包括名稱、標籤等)也很有可能發生變化,(根據SUN的觀點,我們應當能夠通過對sun.*包的修改來提高Java平台的效能。)在這種情況下,即便你希望程式僅僅運行在SUN的實現平台下,你仍將承受新的版本給你的系統帶來破壞的風險。總之,編寫依賴於sun.*包的Java程式是不安全的,他們將變得無法移植,無法被很好地支援。
Java應用程式中的聲音播放