如何将8bit声音转换为16bit

How to convert 8bit sound to 16bit

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

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

为什么不直接使用 Ogg? 太麻烦了。我不想要任何依赖项并且需要跨平台支持,而原始 PCM 使用 DynamicSoundEffectInstance 就可以做到这一点。

我发现我必须以某种方式将 8 位数据恢复为 16 位,以便 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

您可能仍会遇到噪音问题,因为将样本大小减半也会使信噪比减半。

我 运行 在尝试从头开始构建音频播放器时遇到了类似的问题。令我惊讶的是,我发现 8 位音频通常是无符号的,而 16 位音频通常是有符号的。请参阅另一个 SO 用户的回答: