gpt4 book ai didi

Java:在 X-Y 网格上绘制 .flac 音频文件的左声道和右声道。 (示波器)

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

我正在尝试用 Java 创建 X-Y 示波器,但我陷入了困境。我已通读 jFlac 的所有文档、我用来解码 .flac 音频文件的库以及免费的无损音频编解码器文档 here 。我似乎找不到我遇到的问题的答案。请考虑以下事项。

public void processPCM(ByteData pcm) {
byte[] temp = pcm.getData();
line.write(temp, 0, pcm.getLen());
leftAndRight = new int[pcm.getData().length];
for(int i = 0; i < temp.length; i+=2){
leftAndRight[i/2] = (temp[i + 1]<<8) + (temp[i] & 0xff);
}
}

这是我的文件中的示例数据被放入 SourceDataLine 并播放的地方。将数据写入该行后,我希望将左音频和右音频分别转换为单独的整数数组变量 x[] 和 y[]。

这是我正在使用的文件的 StreamInfo:

PCM_SIGNED 44100.0 Hz, 16 bit, stereo, 4 bytes/frame, little-endian

从上面的代码来看,pcm.getLen()返回的值是16384,pcm.getData()返回的是长度为90112的字节数组。如果我没记错的话,就是这个字节数组中的数据,我需要将左右 channel 分开,然后转换为整数数组。这是我不明白如何完成的部分。

编辑:我将上面的代码更改为我遇到的一些代码,我认为这可能是如何将字节数组转换为整数数组,但我仍然不知道左右 channel 是如何排列的。

最佳答案

查看 http://jflac.cvs.sourceforge.net/viewvc/jflac/jFLAC/src/java/org/kc7bfi/jflac/FLACDecoder.java?revision=1.13&view=markup 中的代码看起来字节数组的内容是:一系列样本,每个样本是:一系列 channel ,每个 channel 是:代表一个 channel 上的一个样本的一系列字节,最低有效字节在前。 getLen()的值为其中的有效字节数;由于重复使用同一个 ByteData 对象,可能会出现更多数据,可能会过度分配以避免重复重新分配等。

所以,你会想要这样的东西:

byte[] data = pcm.getData();
int n_bytes = pcm.getLen();
int n_samples = n_bytes / (n_channels*bytes_per_sample);
int k=0;
for (int i=0; i<n_samples; ++i) {
for (int j=0; j<n_channels; ++j) {
output[j][i] = data[k] + (data[k+1)<<8);
k += 2;
}
}

(警告:代码尚未经过测试,可能完全包含语法错误和错误,但希望这个想法足够清晰)。

关于Java:在 X-Y 网格上绘制 .flac 音频文件的左声道和右声道。 (示波器),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5371743/

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