将32位浮点PCM音频转换为16位

时间:2020-10-04 16:11:45

标签: c# uwp dsharp+

我正在尝试转换由AudioGraph API捕获的32位PCM音频数据,以用于DSharpPlus。 opus编码器需要一个16位字节的数组,而Opus编码器的除数和内存访问冲突均引发了问题。

这是我的代码:

private unsafe void OnQuantumStarted(AudioGraph sender, object args)
    {
        try
        {
            lock (_inputFrameLock)
            {
                AudioFrame frame = CaptureFrameNode.GetFrame();
                using (AudioBuffer audioBuffer = frame.LockBuffer(AudioBufferAccessMode.Read))
                {
                    var buffer = Windows.Storage.Streams.Buffer.CreateCopyFromMemoryBuffer(audioBuffer);
                    buffer.Length = audioBuffer.Length;

                    if (buffer.Length > 0)
                    {
                        byte[] newBuffer = new byte[audioBuffer.Length / 2];

                        using (var dataReader = DataReader.FromBuffer(buffer))
                        {
                            dataReader.ByteOrder = ByteOrder.LittleEndian;
                            int pos = 0;
                            while (dataReader.UnconsumedBufferLength > 0)
                            {
                                var singleTmp = dataReader.ReadSingle();
                                var int16Tmp = (Int16)(singleTmp * Int16.MaxValue);
                                byte[] chunkBytes = BitConverter.GetBytes(int16Tmp);
                                newBuffer[pos++] = chunkBytes[0];
                                newBuffer[pos++] = chunkBytes[1]; 
                                //newBuffer[pos++] = chunkBytes[0];
                                //newBuffer[pos++] = chunkBytes[1];
                            }
                        }

                        if (newBuffer.Any(v => v != 0))
                        {
                            voiceTransmitStream.WriteAsync(newBuffer, 0, newBuffer.Length);
                        }

                        buffer = null;
                    }
                }
            }
        } catch (Exception ex)
        {
            var a = ex;
        }
    }

我的转换做错了吗?

0 个答案:

没有答案