【问题标题】:Send/Receive Audio with a socket Java使用套接字 Java 发送/接收音频
【发布时间】:2021-09-26 05:26:18
【问题描述】:

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

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

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

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

【问题讨论】:

  • 要将声音输出到扬声器,您只需将字节写入SourceDataLine,字节来自哪里取决于您。

标签: java sockets io javasound


【解决方案1】:

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

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

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

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

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

我已将此缓冲方案与单个麦克风输入线一起使用。缓冲区使我能够成功地将这些数据与来自 .wav 文件和 PC 上的合成器行的实时回放混合。我还没有尝试从套接字输入音频。

【讨论】:

    猜你喜欢
    • 2013-11-13
    • 1970-01-01
    • 2013-06-18
    • 1970-01-01
    • 2015-05-12
    • 2010-11-14
    • 2011-07-28
    • 2016-10-06
    • 2017-07-13
    相关资源
    最近更新 更多