Java sound API 比較簡單陳舊,受操做系統影響較大,沒法知足一些專業場景。好比在 windows 下8路輸入的聲卡會被識別爲4個2路輸入的設備,沒法協同工做。可是它提供了不少基礎 API,仍是頗有必要了解一下的。html
包:java
類:git
AudioSystem 用來操做各類系統資源,如外接的話筒,輸入等;能夠從這些設備直接獲得io 流;還能夠在各類音頻格式之間轉換。——要注意數據格式和文件格式的區別!github
AudioFormat 用來表示數據格式,包括編碼技術(一般是脈碼調製即 PCM),通道數,採樣率,每一個樣(敏感詞)本位數,幀速率,幀大小,字節順序編程
AudioFileFormat 用來表示文件格式,包括文件類型,文件長度(字節),文件中的音頻數據長度(幀),windows
Mixer 用來表示各類設備,做用是接收 n 錄輸入,處理後送到 n 錄輸出。oracle
Line 是 Port, Mixer, DataLine 的公共父接口,他們能夠對流經的信號進行控制,如gain(以分貝影響信號的體積),pan(影響聲音的左右定位,混響(這會增長聲音的混響)模擬不一樣類型的房間聲學)和採樣率(影響播放速率以及聲音間距)編碼
Port 簡單表示來自或到聲音設備的線spa
DataLine 提供與媒體相關的功能,如音頻格式,媒體位置,緩衝區大小,電平,啓停,暫停和回覆,刷新,drain,活動狀態操作系統
SourceDataLine 用來把數據寫入 Mixer,write()的參數表示寫入緩衝區的數據,建議每次寫入的數據大小比緩衝區大。期間若是調用 stop()會馬上中止播放,剩餘數據殘留在緩衝區,下次再調用 start()會繼續播放。
TargetDataLine 用來從Mixer 接收音頻數據,open()表示準備好,start()開始捕獲數據到緩衝區,read()讀取緩衝區的數據,每次讀取的數據應該比緩衝區小,好比例子中是緩衝區大小的1/5。
綜上,兩種 line 都同樣,open/close 是控制線的程序資源;start/stop 是控制設備;write/read/flush/drain 是控制緩衝區。其中前四個方法會產生事件。
ASIO(Audio stream input output)是一種音頻流輸入輸出API,由 Steinberg 公司開發,可實現低延遲、高同步、高吞吐率。當今主流聲卡都會支持,在 windows 和 mac os 下都有驅動。參考資料中有Steinberg 公司的 ASIO SDK 下載連接,是 C++語音實現的。然而要在 Java 中調用 ASIO並不須要下載此 SDK,而是可使用開源的 JAsioHost 庫。見下一節
另外,ASIO 限制每次只能選定一個設備輸入輸出音頻,沒法支持須要多個設備同時工做的場景。這時可使用一款通用 ASIO 封裝庫 Asio4all。它底層使用 WDM API(Windows Driver Module,一種和 ASIO 相似的音頻輸入輸出 API,但只有 windows 系統支持)訪問音頻設備,對外暴露 ASIO接口。用戶能夠經過它同時訪問多臺音頻設備。
JAsioHost 使用 JNI 技術封裝 asio API,暴露出一套 Java API。開發者能夠直接針對此 API 編程實現音頻輸入輸出。詳細可參考項目介紹。
我在使用JAsioHost時發現給AsioDriver設置採樣率並不生效,不肯定是否bug。
綜上,若是須要用 java 同時操做多臺音頻設備,須要在本機安裝asio4all 驅動,而後基於 JAsioHost 庫編碼操做音頻設備。
順帶一提, JAsioHost API 和 Java Sound API 風格不一樣,前者主動推送數據到調用者,後者被動接受調用者調用拉取數據。所以並不能很簡單地在兩種實現方案之間切換,須要開發者作一些兼容處理。
Java Sound官方文檔: http://docs.oracle.com/javase/tutorial/sound/TOC.html
Steinberg ASIO 驅動 官方下載: https://www.steinberg.net/en/company/developers.html
asio4all官網: http://www.asio4all.com/
JasioHost 項目主頁: https://github.com/mhroth/jasiohost
做者:搞技術的薛彬 連接:https://www.jianshu.com/p/3d27058dc377 來源:簡書 簡書著做權歸做者全部,任何形式的轉載都請聯繫做者得到受權並註明出處。