use*_*794 2 .net c# 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);
}
Run Code Online (Sandbox Code Playgroud)
发送到的音频是waveProvider静态的 - 我认为我没有正确转换。如何转换为 16 位样本的字节数组?
Buffer.BlockCopy复制一些字节,但你传递给它一些元素。由于 afloat是 4 个字节,而 abyte显然是 1,因此您使用四分之一的samples来填充 的一半byteArray,其余部分保持不变。至少可以说,这可能不会给你很好的音频。
您需要做的是将介于 -1 和 1 之间的浮点值转换为介于 -2 15和 2 15 -1之间的 16 位整数值。如果我们转换为shorts 而不是bytes,则相当简单:
shortSample = (short)Math.Floor(floatSample * 32767);
Run Code Online (Sandbox Code Playgroud)
(如果你知道它floatSample总是小于 1,你应该乘以 32,768 而不是 32,767。)
当然,你想要一个字节数组而不是一个short数组。不幸的是,您没有为最后一步提供足够的信息。您需要了解两件事:字节序和签名。如果它是未签名的,则需要通过添加 32,768将其转换short为 a ushort。然后你需要将每个short或ushort最多分成两个字节。字节序确定顺序,但您可能需要进行一些位移。
| 归档时间: |
|
| 查看次数: |
3044 次 |
| 最近记录: |