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

时间:2013-09-08 22:47:46

标签: c# .net audio naudio

我使用NAudio库获取音频,该库返回32位float[]音频数据。我正在尝试找到一种方法将其转换为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位样本的字节数组?

1 个答案:

答案 0 :(得分:3)

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

您需要做的是将-1和1之间的浮点值转换为-2 15 和2 15 -1。如果我们转换为short而不是byte s,则相当简单:

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

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