将 32 位浮点音频转换为 16 位字节数组

本文关键字:字节 字节数 数组 音频 转换 | 更新日期: 2023-09-27 18:30:34

我正在使用返回 32 float[]位音频数据的 NAudio 库获取音频。 我正在尝试找到一种方法将其转换为 16 位byte[]以进行播放。

private void sendData(float[] samples)
{
    Buffer.BlockCopy(samples, 0, byteArray, 0, samples.Length);
    byte[] encoded = codec.Encode(byteArray, 0, byteArray.Length);
    waveProvider.AddSamples(byteArray, 0, byteArray.Length);
    s.Send(encoded, SocketFlags.None);
}

发送到waveProvider的音频是静态的——我认为我没有正确转换。 如何转换为 16 位样本的字节数组?

将 32 位浮点音频转换为 16 位字节数组

Buffer.BlockCopy复制多个字节,但你传递的是许多元素。由于float是 4 个字节,而byte显然是 1,因此您使用samples的四分之一来填充byteArray的一半,其余部分保持不变。至少可以说,这可能不会给你很好的音频。

您需要做的是从 −1 到 1 之间的浮点值转换为 −2 15 和 215−1 之间的16 位整数值。如果我们转换为 short s 而不是 byte s,则非常简单:

shortSample = (short)Math.Floor(floatSample * 32767);

(如果您知道floatSample将始终小于 1,则应乘以 32,768 而不是 32,767。
当然,你想要一个字节数组而不是一个short数组。不幸的是,您没有为最后一步提供足够的信息。您需要了解两件事:字节序和符号。如果未签名,则需要通过添加 32,768 将该short转换为ushort。然后,您需要将每个shortushort拆分为两个字节。字节序决定了顺序,但您可能需要进行一些位移位。