程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA編程入門知識 >> 用Java實現音頻播放

用Java實現音頻播放

編輯:JAVA編程入門知識

  桌面PC的性能日益提高,Java虛擬機的優化技術也不斷獲得突破,這一切使得用Java處理實時信號成為可能。本文將通過設計和構造一個支持實時mp3、WAV和Ogg音頻格式解碼/回放的Java音樂播放器,闡述用JavaSound API編寫音頻處理程序的思路和一般過程。

   <!-- frame contents --> <!-- /frame contents -->   JavaSound是一個小巧的低層API,支持數字音頻和MIDI數據的記錄/回放。在JDK 1.3.0之前,JavaSound是一個標准的Java擴展API,但從Java 2的1.3.0版開始,JavaSound就被包含到JDK之中。由於Java有著跨平台(操作系統、硬件平台)的特點,基於JavaSound的音頻處理程序(包括本文的程序)能夠在任何實現了Java 1.3+的系統上運行,無需加裝任何支持軟件。

  

  一、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獲得數字化的音頻輸入流。

  
  圖二:JavaSound混頻器

  

  類似地,在處理輸出音頻的應用中,混頻器用來對一系列來自SourceDataLine的數據進行混頻處理,經處理後的信號可輸出到各種輸出端口,例如揚聲器、耳機等。SourceDataLine是一個可寫入音頻信號數字流的設備,例如,我們可以從一個WAV文件讀取內容寫入到SourceDataLine,然後再通過揚聲器輸出。

  輸入到混頻器的信號可以來源於剪輯。剪輯(Clip)是一個包含一段完整音頻數據流的設備,或者說,剪輯就是一個緩沖在內存中的完整音頻數據流。在一些要求反復播放音樂片段的場合,例如游戲的背景音樂,剪輯是很有用的。

  圖三描述了JavaSound API中一些常用的類、接口及其關系,所有圖三顯示的類、接口都通過Line這個基本接口統一起來。Line接口用來關閉/打開設備、注冊事件監聽器,以及提供一些用來調整聲音效果的對象,例如調整音量大小的對象。AudioSystem在JavaSound體系中起著一個工廠(Factory)類的作用,提供了一系列的靜態方法,我們通過這些靜態方法來獲取JavaSound系統默認配置的資源(所謂靜態方法,就是可以在不創建AudioSystem實例的情況下直接調用的方法)。

  
  
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved