其他分享
首页 > 其他分享> > CodeGo.net>如何将8位声音转换为16位

CodeGo.net>如何将8位声音转换为16位

作者:互联网

我正在使用DynamicSoundEffectInstance来流式传输原始PCM数据.此数据为16位并已签名.我的代码工作正常,不是一个单一的问题.问题是压缩此原始PCM会产生较差的结果:从13.9mb降至13.7mb.

如果我将PCM数据编码为8位带符号的值,然后对其进行压缩,则结果是一个很小的5.24mb文件-这大约是.比Ogg文件小1mb.

为什么不只使用Ogg?太麻烦了.我不需要任何依赖关系,需要跨平台支持,而原始PCM可以通过DynamicSoundEffectInstance实现.

我发现我必须以某种方式将8bit数据恢复为16bit,以便XNA可以像这样播放它.这是我迷路的地方.我花了无数小时来研究如何做到这一点,但是却一无所获.根本没有.

如何将8位字节转换为16位整数? Convert.ToInt16没有帮助,声音仍然是乱码.

有谁知道做这件事的简单方法,还是我看错了?关于音频,您不能将8bit转换为16bit吗?

编辑:
这是一些使用Convert.ToInt16的非常令人震惊的VB代码.数据数组包含44,100字节的音频.

Dim buffer((44100 * 2) - 1) As Byte ' place to dump 8-16bit data
For i As Integer = 0 To data.Count - 1 ' data holds 8bit data

    Dim aaa = Convert.ToInt16(data(i))
    Dim bb() As Byte = BitConverter.GetBytes(aaa)

    buffer(i * 2) = bb(0)
    buffer(i * 2 + 1) = bb(1)
Next

尽管Windows需要将系统音量控制在100才能听到它,但这确实可行,但它仍然几乎听不到而且充满静电.

解决方法:

根据您的代码示例,似乎剩下要做的唯一事情就是将8位样本向左移8位,以便数据占据16位样本中的最高有效位.

即:

Dim buffer((44100 * 2) - 1) As Byte ' place to dump 8-16bit data

For i As Integer = 0 To data.Count - 1 ' data holds 8bit data

    Dim aaa = Convert.ToInt16(data(i)) << 8 ' shift to most-significant-bits
    Dim bb() As Byte = BitConverter.GetBytes(aaa)

    buffer(i * 2) = bb(0)
    buffer(i * 2 + 1) = bb(1)
Next

您可能仍然会遇到噪声问题,因为将样本大小减半也会将信噪比减半.

标签:monogame,bit-shift,vb-net,c
来源: https://codeday.me/bug/20191120/2045952.html