gpt4 book ai didi

core-audio - 如何手动将8.24位解交织的lpcm转换为16位lpcm?

转载 作者:行者123 更新时间:2023-12-04 13:29:12 25 4
gpt4 key购买 nike

我有一块数据(void *)是2 ch,44100 Hz,'lpcm'8.24位little-endian有符号整数,已解交织。
我需要将该块记录为2 ch,44100 Hz,'lpcm'16位little-endian有符号整数。

如何转换数据?我可以想象我需要做这样的事情:

uint dataByteSize = sizeof(UInt32) * samplesCount;
UInt32* source = ...;
UInt32* dest = (UInt32*)malloc(dataByteSize);
for (int i = 0; i < samplesCount; ++i) {
UInt32 sourceSample = source[i];
UInt32 destSample = sourceSample>>24;
dest[i] = destSample;
}

但是,如何将去交错的转换为交错的呢?

最佳答案

好的,我花了一些时间调查此问题,并意识到该问题包含的信息太少,无法回答=)
所以这笔交易:

首先,关于非交织:
我最初以为它看起来像这样:
l1 l2 l3 l4 ... ln r1 r2 r3 r4 ... rn
但是事实证明,在我的数据权利 channel 中只是缺失了。事实证明,它不是非交织的数据,而只是普通的单声道数据。
是的,它应该始终是多个缓冲区,以防数据实际上是非交错的。
如果是交错的,应该是
l1 r1 l2 r2 l3 r3 l4 r4 ...

第二,关于实际的转换:
这一切都取决于 sample 的范围。就我而言(如果我正确的话,以及在涉及核心音频的任何情况下),定点8.24值的范围应在(-1,1)之间,而16位有符号值的范围应在(-32768,32767)之间。
因此,8.24值将始终将其前8位设置为0(如果为正)或为1(如果为负)。前8位应删除(保留c的符号)。另外,您可以根据需要删除任意数量的尾随位-这只会降低声音的柔和度,但不会破坏声音。如果转换为16位带符号格式,则8-22位(即15位)实际上将包含我们需要用于SInt16的数据。位7可用作符号位。
因此,要将8.24转换为SInt16,您只需要向右移9位(因为您需要保留符号就将其移至9位)并转换为SInt16

11111111 10110110 11101110 10000011-> 11111111 11111111(11011011 01110111)
00000000 01101111 00000000 11000001-> 00000000 00000000(00110111 10000000)

而已。再没有什么比遍历数组和右移位更重要了。
希望这可以节省一个人几个小时。

关于core-audio - 如何手动将8.24位解交织的lpcm转换为16位lpcm?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5323739/

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