繁体   English   中英

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

[英]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也没有用,声音还是乱码胡说八道。

有谁知道一个简单的方法来做到这一点,还是我认为这一切都错了? 关于音频,您不能像这样将 8 位转换为 16 位吗?

编辑:这是使用 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 位样本的最高有效位。

IE:

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 用户的答案:

https://stackoverflow.com/a/43939741/7732473

暂无
暂无

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

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