gpt4 book ai didi

audio - uwp audioGraph将32位转换为16位pcm

转载 作者:行者123 更新时间:2023-12-02 22:26:08 25 4
gpt4 key购买 nike

我需要将录音从麦克风传递到缓冲区,然后从缓冲区传递到扬声器(我通过网络发送缓冲区)。
我的配置:Mic-> AudioFrameOutput-> Network-> AudioFrameInput-> Speakers。

我需要以16位/样本PCM(用于网络)进行记录。
AudioGraph的文档提到它仅支持32位浮点格式。
如何将32位录音转换为16位然后播放录音?

谢谢,
托尼

最佳答案

如何将32位浮点数转换为16位整数是流音频世界中非常普遍的愿望...在这里,我们将32位浮点缓冲区(数组)的元素转换为有损(32位不适合16位) )无符号16位整数...,输入浮点从-1到+1变化

my_16_bit_unsigned_int = ((input_32_bit_floats[index] + 1.0) * 32768) - 1;

在最直接的级别上播放音频数据时,您会面临许多基本的设计决策:
  • 是输入的 float 声波,范围从例如-1到+1,或从-0.5到+0.5,或从例如0到+1或其他
  • 我是否希望我的输出16位PCM是带符号的或无符号的(通常是无符号的)
  • 是我处理的是大字节序还是小字节序字节排序,这在通过网络发送内存缓冲区(通常是小字节序)时尤其重要,尤其是当您可能需要将16位整数缓冲区折叠为字节流时

  • 知道了这些问题并在公式上考虑了数据之后得到了答案,并假定音频波的输入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个不同的整数值

    让我们用具体的例子来分解
  • 这次输入的32位浮点值从-1.0到+1.0 ...实际上范围是-1

    示例
    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;

  • 关于audio - uwp audioGraph将32位转换为16位pcm,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42062856/

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