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