gpt4 book ai didi

java - 可以写入 SourceDataLine 的数据格式是什么?

转载 作者:行者123 更新时间:2023-11-30 04:20:36 26 4
gpt4 key购买 nike

在java中你可以像这样创建一个SourceDataLine:

AudioFormat af = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, 44100.0, 16, 1, 2, 44100.0, false);       
SourceDataLine sdl = AudioSystem.getSourceDataLine(af);

之后您可以打开它并向其写入数据:

byte[] data = new byte[1024];
fillwithsounds(data);

sdl.open()
sdl.start()
sdl.write(data, 0, 1024);

这对于单声道数据来说一切正常。

我想做的是能够写入立体声数据,但我在网上找不到任何有关如何更改字节数组才能写入立体声数据的文档。

在创建 AudioFormat 时,我似乎需要增加 channel 数量 - 使其成为立体声 - 然后我需要将帧速率减半(否则 Java 会抛出 IllegalArgumentException)

我不明白为什么会这样,也不明白我提供给 DataSourceLine 的数据的新格式应该是什么。

也许在音频格式方面比我更有经验的人可以阐明这个问题。提前致谢!

最佳答案

我用于立体声的格式如下:

        audioFmt = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, 
44100, 16, 2, 4, 44100, false);

您可能希望将每帧的字节数加倍,而不是将位编码减半。我不确定 8 位编码听起来是什么样的,但它肯定会比 16 位编码噪音更大!

生成的文件长度是原来的两倍。然后,您可以获取构成 16 位样本的两字节对,并将它们复制到接下来的两个位置,以进行“单声道”播放(两个立体声 channel 相同)。

给定:

frame = F
little end byte = A
big end byte = B
AB = 16-bit little-endian encoding
left channel = L
right channel = R

你原来的单声道:

F1A、F1B、F2A、F2B、F3A、F3B ...

使用上述格式的立体声:

F1AL、F1BL、F1AR、F1BR、F2AL、F2BL、F2AR、F2BR、F3AL、F3BL、F3AR、F3BR ...

我很可能把左右的顺序搞混了。但我希望你能明白!

关于java - 可以写入 SourceDataLine 的数据格式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17159072/

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