使用Java套接字发送/接收音频



我最近完成了一个简单的基于套接字的消息传递程序,该程序使用256字节块加密,并希望将其升级以处理声音。经过一点研究,我发现javax.sound.*似乎无法播放或录制连续的声音流。我以为我可以使用AudioSystem.getAudioInputStream(InputStream(,但它的Javadoc说:

流必须指向有效的音频文件数据。

所以我不能将它用于连续流。

如何使客户端能够用Java发送和接收连续的音频流?(更好的是,我如何让一台服务器能够接收多个流并将其组合,以实现群聊功能?(

您要查找的用于流式传输传入音频数据的类是TargetDataLine。

如果要混合音频,首先需要从字节中导出PCM。PCM值可以简单地相加在一起(尽管通常会应用最大值和最小值来防止溢出值,这听起来非常可怕(,结果直接指向SourceDataLine。

我想最棘手的部分是有序地阅读不同的行。我的第一个猜测是创建多个FIFO缓冲区,从不同的输入线读取(每条输入线一个FIFO(。然后,另一个线程可以根据需要有序地轮询这些缓冲区中的数据。包含这些缓冲器的主要原因是允许混合发生,而不受各种贡献线的输入速率的任何不确定性的影响。这样,如果一行滞后,就没有阻塞整个作品的风险,该行的缓冲区可以简单地呈现0值,混合线程可以连续向扬声器发送未中断的数据。

像ConcurrentLinkedQueue这样的东西可能是最好的,因为您需要同时让服务器输入和混合器线程访问缓冲区。

不过,出于某种原因,我从未见过多个扬声器混合在一起进行现场聊天。通常一次只允许一条线路处于活动状态。如果你想让它与现场混音配合使用,我很想听听它的进展。我怀疑没有这样做有充分的实际原因。

我在一条麦克风输入线上使用了这种缓冲方案。缓冲区使我能够成功地将这些数据与电脑上.wav文件和合成线的实时播放相混合。我还没有尝试从插座输入音频。

最新更新