gpt4 book ai didi

java - SourceDataLine 格式支持问题

转载 作者:行者123 更新时间:2023-12-02 12:36:08 26 4
gpt4 key购买 nike

我有一个用 Java 编写的应用程序,我需要在其中播放音频。我使用 OpenAL(带有 java-openal 库)来完成该任务,但是我想使用 OpenAL 不直接支持的 WSOLA。我发现了一个不错的 Java 原生库,名为 TarsosDSP,它支持 WSOLA。

该库使用标准 Java API 进行音频输出。该问题发生在 SourceDataLine 设置期间:

IllegalArgumentException: No line matching interface SourceDataLine supporting format PCM_UNSIGNED 16000.0 Hz, 16 bit, mono, 2 bytes/frame, little-endian is supported.

我确保问题不是由缺乏权限引起的(在 Linux 上以 root 身份运行 + 在 Windows 10 上尝试过),并且项目中没有使用其他 SourceDataLine。

修改格式后,我发现当格式从 PCM_UNSIGNED 更改为 PCM_SIGNED 时,格式会被接受。这似乎是一个小问题,因为仅将字节范围形式从无符号移动到有符号应该非常容易。然而奇怪的是它本身并不支持。

那么,是否有一些解决方案可以让我不必修改源数据?

谢谢,简

最佳答案

您不必手动移动字节范围。创建 AudioInputStream 后,您可以创建另一个具有签名格式的 AudioInputStream,并连接到第一个未签名的流。如果您随后使用签名流读取数据,声音 API 会自动转换格式。这样您就不需要修改源数据。

File fileWithUnsignedFormat;

AudioInputStream sourceInputStream;
AudioInputStream targetInputStream;

AudioFormat sourceFormat;
AudioFormat targetFormat;

SourceDataLine sourceDataLine;

sourceInputStream = AudioSystem.getAudioInputStream(fileWithUnsignedFormat);
sourceFormat = sourceInputStream.getFormat();

targetFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED,
sourceFormat.getSampleRate(),
sourceFormat.getSampleSizeInBits(),
sourceFormat.getChannels(),
sourceFormat.getFrameSize(),
sourceFormat.getFrameRate(),
false);

targetInputStream = AudioSystem.getAudioInputStream(targetFormat, sourceInputStream);

DataLine.Info dataLineInfo = new DataLine.Info(SourceDataLine.class, targetFormat);
sourceDataLine = (SourceDataLine) AudioSystem.getLine(dataLineInfo);

sourceDataLine.open(targetFormat);
sourceLine.start();


// schematic
targetInputStream.read(byteArray, 0, byteArray.length);
sourceDataLine.write(byteArray, 0, byteArray.length);

关于java - SourceDataLine 格式支持问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45132587/

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