0

所以我找到了一些 C 代码来解压缩某些 PCM 样本,我想在 AS3 中做同样的事情。我试图这样做,但它似乎没有工作。我对 C 知之甚少,虽然我对 AS3 相当流利,所以我可能翻译不正确。

这是C代码:

BYTE  bShift; // shift value
char *inputBuffer[dwSize];

SHORT iCurValue;
DWORD i;

iCurValue=0x0000;

for (i=0;i<dwSize;i++)
{
    iCurValue+=(signed short)inputBuffer[i];
    Output(iCurValue<<bShift);
}

Output()是对解压缩样本值执行的操作的占位符。)

这是我在 AS3 中创建的一个函数,它应该做同样的事情:

private function pcmDecompress(pcmBytes:ByteArray, shift:int):ByteArray
{
    var input:ByteArray = pcmBytes;
    var output:ByteArray = new ByteArray();
    output.endian = Endian.LITTLE_ENDIAN;

    var iCurValue:int = 0x0000;

    for (var i:int = 0; i < input.length; i++)
    {
        iCurValue += input[i];
        output.writeShort(iCurValue << shift);
    }

    return output;
}

之后,我对 WAV 文件进行编码并保存,output用作包含样本的数据部分。WAV 文件播放,但我听到的只是很多静态的。

任何帮助将不胜感激。

4

1 回答 1

0

取决于您的平台,但在 32 位系统上:

  1. C 中的“短”数据类型通常为 16 位宽。
  2. AS3 中的“int”数据类型为 32 位宽。

现在看看这些 C 行:

char *inputBuffer[dwSize];

iCurValue+=(signed short)inputBuffer[i];

第一个说我们有一个字节流(您的 Delta PCM 编码波形)。

第二个告诉计算机将这些视为 16 位值流。为什么?因为您的 C 代码可能假定样本大小为 16 位。您的 AS3 代码不执行此部分(将字节数组解释为短数组)。

如果我这样做,我会改变

iCurValue += input[i];

是这样的:

iCurValue += input.readShort();

因此,您一直在读取字节流,就好像它是ints 一样,从而读取垃圾(这解释了您所听到的内容)。

希望有帮助!

于 2013-04-07T22:46:09.367 回答