簡體   English   中英

使用套接字 Java 發送/接收音頻

[英]Send/Receive Audio with a socket Java

我最近完成了一個簡單的基於套接字的消息傳遞程序,它使用 256 字節的塊加密,並希望升級它以處理聲音。 經過一番研究,我發現 javax.sound.* 似乎無法播放或錄制連續的聲音流。 我以為我可以使用 AudioSystem.getAudioInputStream(InputStream),但它的 Javadoc 說:

流必須指向有效的音頻文件數據。

所以我不能將它用於連續流。

我將如何使客戶端能夠在 Java 中發送和接收連續的音頻流? (更好的是,我如何使服務器能夠接收多個流並將它們組合起來,以實現群聊功能?)

您正在尋找的用於流式傳輸傳入音頻數據的類是TargetDataLine

如果要混合音頻,首先需要從字節中導出 PCM。 PCM 值可以簡單地加在一起(盡管通常應用最大值和最小值來防止溢出值,這聽起來非常可怕),並將結果定向到SourceDataLine

我想最棘手的部分是以有序的方式閱讀各行。 我的第一個猜測是創建多個 FIFO 緩沖區,從您的各種傳入線路(每個傳入線路一個 FIFO)讀取。 然后,另一個線程可以有序地、按需輪詢這些緩沖區中的數據。 包含這些緩沖區的主要原因是允許混合發生而不受各種貢獻線的輸入速率的任何變幻莫測的影響。 這樣,如果一條線路滯后,則不會有阻塞整個工作的風險,該線路的緩沖區可以簡單地呈現 0 值,並且混合線程可以不間斷地向揚聲器連續發送數據。

ConcurrentLinkedQueue這樣的東西可能是最好的,因為您需要讓服務器輸入和混合器線程訪問緩沖區。

但是,出於某種原因,我從未見過多個演講者進行現場混音的聊天。 通常一次只允許一條線路處於活動狀態。 如果你試圖讓它與現場混音一起工作,我很想聽聽它是如何進行的。 我懷疑為什么沒有這樣做有充分的實際原因。

我已經將這種緩沖方案與單個麥克風輸入線一起使用。 緩沖區使我能夠成功地將這些數據與來自 .wav 文件和 PC 上的合成器線路的實時播放混合。 我還沒有嘗試過從插座輸入音頻。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM