我需要将录音从麦克风传递到缓冲区,然后从缓冲区传递到扬声器(我通过网络发送缓冲区)。 我的配置:Mic-> AudioFrameOutput-> Network-> AudioFrameInput->扬声器。
我需要录制16位/样本PCM(用于网络)。 AudioGraph的文档提到它只支持32位浮点格式。 如何将32位录音转换为16位然后播放录音呢?
谢谢, 贝
答案 0 :(得分:2)
如何将32位浮点数转换为16位整数是流音频领域的一个非常普遍的愿望...这里我们将32位浮点缓冲区(数组)的元素转换为有损(32位不适合16位无符号16位整数...输入浮点数从-1变化到+1
my_16_bit_unsigned_int = ((input_32_bit_floats[index] + 1.0) * 32768) - 1;
在最直接的级别播放音频数据时,您会遇到许多基本的设计决策:
在仔细考虑上面的数据之后知道这些问题并得到答案的确假设音频波的输入32位浮点表示从-1.0到+1.0(典型值)
你问这个值32768来自哪里? ... 16位整数有2 ^ 16个不同的值,范围从0到(2 ^ 16 - 1)所以如果你的输入浮点数从-1到+1变化,我们首先加1使它从0变为+2这使得我们的输出无符号(无负数),然后我们将该范围中的值乘以32768然后减去1以适应0的起始下限,使得整数的输出范围从0到(2 ^ 16-1)变化。 。或0到65537,它给你总共2 ^ 16个不同的整数值
让我们用具体的例子来分解它
示例A
inputA = -0.999 # close to minimum possible value
outputA = int((input_32_bit_floats[index] + 1.0) * 32768) - 1;
outputA = int(( -0.999 + 1.0) * 32768) - 1;
outputA = int( 0.001 * 32768) - 1;
outputA = int( 32.768) - 1;
outputA = 33 - 1;
outputA = 32; # close to min possible value of 0
示例B
inputB = 0.999 # almost max possible value
outputB = int((input_32_bit_floats[index] + 1.0) * 32768) - 1;
outputB = int((0.999 + 1.0) * 32768) - 1;
outputB = 65503 - 1;
outputB = 65502 # close to our max possible value of 65537
你可以通过向左移位来加速乘以32768 ...你移位了多少位位置是由你的换档操作替换的2的幂来驱动的......
outputA = int((input_32_bit_floats[index] + 1.0) * 32768) - 1;
会变成
outputA = ( int(input_32_bit_floats[index] + 1.0) << 15) - 1;