2010-05-19 106 views
4

我正在寫一個簡單的軟件,通過局域網流式傳輸音頻。我已經實現了所有的網絡部分,但是我正在使用Java Sound API。我已經成功地從麥克風捕捉音頻,並且線路輸入,但是我似乎無法從任何目標端口捕獲音頻。我的問題是,是否有可能從主目標端口捕獲?這是初始化該行的一段代碼。Java聲音API:從目標端口捕獲聲音輸出

private boolean startCapture(){ 
    try{ 
     DataLine.Info info = new DataLine.Info(TargetDataLine.class, format); 
     line = (TargetDataLine)AudioSystem.getLine(info); 
     audioBuffer = new byte[bufferSize]; 
     line.open(format); 
     line.start(); 
     return true; 
    }catch(Exception e){ 
     System.out.println("Exception thrown when capturing audio:\n" + e); 
     return false; 
    } 
} 

運行這樣的代碼將只使用麥克風作爲我的線。 Here是關於我的音響系統的信息。最重要的可能是我正在運行Linux。

在此先感謝您提供給我的任何和所有幫助。

+0

所以你讓它工作? – 2013-03-11 14:49:34

+0

沒有。我永遠無法直接訪問我需要的東西。 – 2013-03-15 19:06:52

+0

所以你想從揚聲器記錄它? – 2013-03-16 13:26:47

回答

0

揚聲器是SourceDataLine,而不是TargetDataLine。我不明白你如何從演講者「捕捉」?

+0

它仍然是調音臺上的一個端口。我的理解是,在它進入揚聲器之前,你仍然可以從調音臺獲得它。必須有一種方法來獲取通過該端口的數據。 – 2010-05-20 07:15:13

1

網絡聲音的一個問題是,由於聲卡時鐘之間的差異,每一端的計算機可能會有略微不同的採樣率。電腦時鐘有所不同。如果發送計算機的速度比接收計算機慢,那麼即使你有一個緩衝區,你的緩衝區也會緩慢地清空。如果運行速度更快,那麼您將慢慢獲得過多的數據。 This person嘗試了你正在做的事情,並看到輟學。請注意,購買更昂貴的聲卡可以減少他的問題,但不能完全解決問題,除非他做了像鎖定GPS時間信號那樣的東西。你典型的臨時用戶不會那樣做。

也許對於短傳輸,你可以擺脫它。例如,如果您正在進行語音操作,並且在揚聲器安靜時停止傳輸,那麼當您重新啓動時,您可以同步緩衝區。我想知道它會對延遲做什麼。 「適當的」解決方案需要在接收端重新採樣音頻以處理採樣率的微小差異。

對於如此小的頻率變化,您可能會忽略最近的鄰居 - 經常跳過或複製樣本。我聽說過的數字業餘無線電軟件在樣本之間使用線性插值。您需要維護一個縮放因子並對其進行控制,以確保您以新數據進入的速度清空緩衝區,但有一個控制循環不會因網絡變幻莫測而太不安,也不會嘗試突然發生大的變化。

我不知道你是否考慮過這個問題。我見過有人沒有嘗試過。我除了現在人們會使用現成的音頻會議庫來處理這種事情。如果你對如何做到這一點感興趣,數字業餘無線電社區是一個好地方。

+0

這不是我想到的。我很感激你的迴應。由於我無法訪問該部分,因此我的這一側面項目已經死了一段時間了。我不確定我是如何同步這兩者的,但你的解釋對於進一步理解我很有幫助。 – 2011-06-22 22:27:10

1

這是一種方式(不是編程方式)。

轉到:控制面板\硬件和聲音\ 點擊聲音圖標。現在開始錄製,右鍵單擊 - >選擇兩個 - 選擇啓用,斷開devices.You你會發現「立體聲混合」圖標。使其成爲默認設備。

現在嘗試錄製聲音。問題解決了。

+0

是的,這是有效的,但只適用於Windows。我需要跨平臺兼容性。這是它首先用Java編寫的全部原因。 – 2013-04-01 16:56:24