[英]Convert 32 bit float audio to 16 bit byte array?
我正在使用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位样本的字节数组?
Buffer.BlockCopy
复制许多字节,但是您要传递许多元素。 由于float
是4个字节,而一个byte
显然是1,因此您要使用四分之一的samples
来填充byteArray
一半,其余部分则保持不变。 至少可以说,这可能不会给您带来很好的音频。
您需要做的是将-1到1之间的浮点值转换为-2 15到2 15 -1之间的16位整数值。 如果我们转换为short
而不是byte
,那么这很简单:
shortSample = (short)Math.Floor(floatSample * 32767);
(如果知道floatSample
始终小于1,则应乘以32,768而不是32,767。)
当然,您需要字节数组而不是short
数组。 不幸的是,您没有为最后一步提供足够的信息。 您需要了解两件事:字节序和签名。 如果是无符号,你需要将其转换short
到ushort
通过增加32,768。 然后,您需要将每个short
或ushort
分成两个字节。 字节序确定顺序,但是您可能需要进行一些移位。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.