【发布时间】:2018-03-20 23:19:19
【问题描述】:
我正在尝试将我的 32 位有符号 int 音频数据转换为 24 位有符号。 目标是编写一个 Wave 文件。我已经设法编写了 8、16 和 32 位深度的正确 Wave 文件,但由于某种原因,我在 24 位时遇到了困难。声音输出听起来像 8 位(很多噪音),这似乎意味着只有 MSB 被正确解释,24 位值的第二个和第三个字节似乎不起作用。
代码:
int buffer_32[1024];
unsigned char buffer_24[1024*3];
for (unsigned i = 0; i < 1024; i++)
{
buffer_24[i*3] = (unsigned char)((buffer_32[i] & 0xff0000) >> 16);
buffer_24[i*3+1] = (unsigned char)((buffer_32[i] & 0xff00) >> 8);
buffer_24[i*3+2] = (unsigned char)(buffer_32[i] & 0xff);
}
基本上,我操纵字节来创建一个 24 位流(“24 位打包”)。
我不知道我的转换算法出了什么问题:你能帮帮我吗?
编辑:我忘了说,在进入此转换循环之前,我的 int 值已经正确缩放到 -8388608,8388607(24 位有符号整数)范围。
【问题讨论】:
-
你使用的是 32 的低 24 位。你需要使用高位。
-
您是否已完成打印以检查:
printf("0x%.6X . = %.2X %.2X %.2X\n", buffer_32[i] & 0xFFFFFF, buffer_24[i*3+0], buffer_24[i*3+1], buffer_24[i*3+2]);作为循环的最后一条语句?打印出来的值是否一致? -
您确定您的输出字节顺序与您使用的任何播放器的预期字节顺序相匹配吗?我有兴趣查看此代码的 16 位版本,看看它们是否匹配。