gpt4 book ai didi

java - 将 PCM 字节数组转换为环绕声道

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

据我了解,我使用的音频字节数组(PCM 立体声 16 位)是每个样本 4 个字节。我注意到当您反转字节值(即 -128 到 128 和 128 到 -128)时,它不会将声音放入环绕声道。听起来一样(前置音频)。我尝试每隔一个字节(每 2 个字节)而不是所有字节进行反转,并得到类似环绕声的效果,但它非常脏且不稳定。我究竟该如何操作常规 PCM 16 位立体声 WAV 文件(以字节数组形式),以便将音频放置在环绕声道中?

我的代码:

public byte[] putInSurround(byte[] audio) {
for (int i = 0; i < audio.length; i += 4) {
int i0 = audio[i + 0];
int i1 = audio[i + 1];
int i2 = audio[i + 2];
int i3 = audio[i + 3];
if (0 > audio[i + 0]) {
i0 = Math.abs(audio[i + 0]);
}
if (0 < audio[i + 0]) {
i0 = 0 - audio[i + 0];
}
if (0 > audio[i + 1]) {
i1 = Math.abs(audio[i + 1]);
}
if (0 < audio[i + 1]) {
i1 = 0 - audio[i + 1];
}
if (0 > audio[i + 2]) {
i2 = Math.abs(audio[i + 2]);
}
if (0 < audio[i + 2]) {
i2 = 0 - audio[i + 2];
}
if (0 > audio[i + 3]) {
i3 = Math.abs(audio[i + 3]);
}
if (0 < audio[i + 3]) {
i3 = 0 - audio[i + 3];
}
audio[i + 0] = (byte) i0;
//audio[i + 1] = (byte) i1; <-- Commented Out For Every Other Byte.
//audio[i + 2] = (byte) i2; <-- Commented Out For Every Other Byte.
audio[i + 3] = (byte) i3;
}
return audio;
}

最佳答案

我在任何方面都不是 DSP 专家,但我有一些可能有用的观察:

  • 您以 4 字节为增量解析数组,这正确对应于单个 16 位立体声样本:2 channels * 16 bits = 32 bits = 4 bytes .

    现在,我可能不明白您要做什么,但在现代环绕声中,环绕声声道通常独立彼此。这意味着每个环绕声音频样本需要超过 4 个字节。例如,如果您有 5 个 channel ,则需要 10 个字节/样本,这可能意味着您需要在代码中使用单独的输入和输出数组。

    Dolby Surround等方法和 Dolby Pro Logic ,其中环绕声 channel 被矩阵编码为两个立体声 channel ,但所涉及的 DSP 数学比代码中的复杂得多。更不用说对特殊解码器的需求以及此类方法隐含的质量损失。

  • 反转 2 字节 样本的每个字节是没有意义的:1000d 的样本值将变为 -744d。像这样的按位运算在 DSP 中很少使用,如果有的话。

  • 通常,音频样本存储为带符号的 2 的补码二进制数。这使得按字节处理它们非常复杂,尤其是在没有无符号数字和指针转换的语言中,例如 Java。您最好将字节数组转换为 short 的数组或 int - 或使用不同的编程语言,例如 C++。

  • 反转 -128 产生 +128,它不能存储在 Java 使用的带符号字节中。

  • 当“相互反转字节”时,您存储 i + 0 的倒数和 i + 3 , 而不是 i + 0i + 2i + 1i + 3 .

  • 相互反转字节的结果虽然仍然没有任何意义,但具有不同的效果,具体取决于您的音频表示是否为 little-endian or big-endian。 . RIFF WAV files使用小端字节顺序。

    反转字节 0 和 2 会更改样本的 LSB,这只会在音频剪辑的动态范围有限时增加高振幅噪声和彻底失真。

    反转字节 1 和 3 将近似以高振幅反转整个样本,并在动态范围有限的剪辑中添加很多失真。

  • 反转整个样本,而不是单个字节,是 180 度相移的近似值。不过我不确定你可以在哪里使用它...

如果您需要比这更多的帮助,您需要告诉我们您到底想做什么。您至少应该提及您的预期输出是什么以及您使用的是哪种 DSP 算法。

关于java - 将 PCM 字节数组转换为环绕声道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5596677/

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