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

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

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

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

我将如何使客户端能够在 Java 中发送和接收连续的音频流? (更好的是,我如何让服务器能够接收多个流并将它们组合起来,以实现群聊功能?)

wduke8818 回答:使用套接字 Java 发送/接收音频

您正在寻找的用于流式传输传入音频数据的类是 TargetDataLine

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

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

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

不过,出于某种原因,我从未见过多个演讲者进行现场混音的聊天。通常一次只允许一条线路处于活动状态。如果你试图让它与现场混音一起工作,我很想听听它是如何进行的。我怀疑为什么没有这样做有充分的实际原因。

我已将这种缓冲方案与一条麦克风输入线一起使用。缓冲区使我能够成功地将这些数据与来自 .wav 文件和 PC 上的合成器线路的实时回放混合在一起。我还没有尝试过从插座输入音频。

本文链接:https://www.f2er.com/78567.html

大家都在问