gpt4 book ai didi

java - 实时wav播放

转载 作者:太空宇宙 更新时间:2023-11-04 07:33:16 26 4
gpt4 key购买 nike

我编写了一个播放 .wav 文件的代码。效果很好。现在,另一段代码从音频接收器获取音乐数据并不断附加到该 .wav 文件。

假设当我运行播放器时音频长度为 5 秒,现在尽管使用更新程序代码更新了 wav 文件,但播放器仅播放最初的 5 秒。

播放代码很简单:

try{
AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(new File("junk.wav"));
Clip clip = AudioSystem.getClip();
clip.open(audioInputStream);
clip.start();
}catch(Exception ex){
System.out.println("Error with playing sound.");
ex.printStackTrace();
}

如何在输入进入麦克风插孔后立即播放音频流(允许一些延迟)?

最佳答案

您没有发布问题,因此答案将是笼统的。

wav 文件具有严格定义的格式。它包含标题和数据(声音样本)。 header 定义了 wav 文件中的数据数量。为了播放音频, header 提供了采样率等附加信息。如果您使用 AudioInputStream 打开 wav 文件,它会解析这些信息。由于 header 中定义的数据长度,您无法将数据附加到 wav 文件。您可以修改 wav 文件数据样本,但必须确保交换的数据具有相同的格式。

当您打开 Class AudioInputStream 的文档时,第一条语句是:“音频输入流是具有指定音频格式和长度的输入流。”

从操作系统的角度来看。

在实时播放器中使用文件作为缓冲区可能会出现问题。文件系统在多个级别上进行缓冲/缓存,以提供对大内存块的快速访问。即时读/写文件甚至可能导致文件损坏。如果我理解你想在 WAV 文件中创建一个循环缓冲区(一次又一次地覆盖相同的样本)。您会发现将文件的新内容(由编写器提供)与循环播放的剪辑同步时会遇到其他问题。

你能做什么?

您可以使用 SourceDataLine/TargetDataLine。接下来动态读取样本并将其保存在字节缓冲区(例如 byte[] 或 ByteBuffer)而不是文件中。您必须首先用传入数据填充缓冲区,然后在循环中从/到 xxxDataLine 进行读/写操作。您必须注意该行是针对特定音频格式打开的。输入和输出使用相同的格式。并非所有格式都受支持(这取决于硬件,因此对于 Java 来说这是一个“温和”的东西)。请注意,有时即使以字节为单位给出的数据大小也必须调整为帧大小(每个样本 16 位 = 2 字节)。

关于java - 实时wav播放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17367944/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com