繁体   English   中英

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

[英]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数组。 不幸的是,您没有为最后一步提供足够的信息。 您需要了解两件事:字节序和签名。 如果是无符号,你需要将其转换shortushort通过增加32,768。 然后,您需要将每个shortushort分成两个字节。 字节序确定顺序,但是您可能需要进行一些移位。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM