所以我找到了一些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文件播放,但我听到的都是静态的。
非常感谢任何帮助。
答案 0 :(得分:0)
取决于您的平台,但在32位系统上:
现在看看这些C:
行char *inputBuffer[dwSize];
和
iCurValue+=(signed short)inputBuffer[i];
第一个说我们有一个字节流(你的Delta PCM编码波形)。
第二个告诉计算机将这些视为16位值。为什么?因为您的C代码可能假定为16位样本大小。您的AS3代码不执行此部分(将字节数组解释为短数组)。
如果我这样做,我会改变
iCurValue += input[i];
类似于:
iCurValue += input.readShort();
所以你一直在读取字节流,好像它是int
s,从而读取垃圾(解释了你所听到的内容)。
希望有所帮助!