混音16位立体声PCM音频



我正在尝试创建NAudio的MixingWaveProvider32的16位PCM版本,该版本在16位PCM样本上运行,而不是32位浮点数。

每个16位立体声样本都打包在字节数组中,如下所示

<表类> 字节0 字节1 字节2 字节3 通道1(左)Lo 通道1 Hi 通道2(右)Lo 通道2 Hi

你总是可以使用不安全的代码,这应该会更快,因为你节省了一堆方法调用和对象分配:

        // setup some input data
        byte[] b1 = {0x1, 0x0, 0x2, 0x0, 0x3, 0x0, 0x4, 0x0};
        byte[] b2 = new byte[b1.Length];
        Array.Copy(b1, b2, b1.Length);
        byte[] result = new byte[b1.Length];
        fixed (byte* b1Ptr = b1)
        {
            fixed (byte* b2Ptr = b2)
            {
                fixed (byte* rPtr = result)
                {
                    var s1Ptr = (short*) b1Ptr;
                    var s2Ptr = (short*) b2Ptr;
                    var srPtr = (short*) rPtr;
                    var length = b1.Length / 2;
                    for (int i = 0; i < length; i++)
                    {
                        var v = s1Ptr[i] + s2Ptr[i];
                        srPtr[i] = (short) v;
                        Console.WriteLine($"{s1Ptr[i]} + {s2Ptr[i]} -> {srPtr[i]}");
                    }
                }
            }
        }

注意求和值可能会导致溢出。您可能应该对两个样本取平均值,或者夹紧结果以避免这种情况。

最新更新