C# NAudio将采样缓冲区转换为波形缓冲区

C# NAudio将采样缓冲区转换为波形缓冲区,c#,.net,audio,naudio,sample,C#,.net,Audio,Naudio,Sample,我的目标是让NAudio实时处理和回放音频数据。该应用程序使用不同的格式:8位pcm、16位pcm、24位pcm。对于播放,我使用WaveOut和BufferedWaveProvider。实时处理单个样本会带来困难。要将原始数据转换为样本,我使用以下代码: var vaweProviderIn = new BufferedWaveProvider(format); vaweProviderIn.AddSamples(waveBuffer, 0, waveBuffer.Length); var s

我的目标是让NAudio实时处理和回放音频数据。该应用程序使用不同的格式:8位pcm、16位pcm、24位pcm。对于播放,我使用WaveOut和BufferedWaveProvider。实时处理单个样本会带来困难。要将原始数据转换为样本,我使用以下代码:

var vaweProviderIn = new BufferedWaveProvider(format);
vaweProviderIn.AddSamples(waveBuffer, 0, waveBuffer.Length);
var sampleProvider = vaweProviderIn.ToSampleProvider();
sampleProvider.Read(sampleBuffer, 0, sampleBufferSize);
//samples processing

问题是如何将samples缓冲区转换回wave缓冲区来播放它?

我编写了自己的代码来解决这个问题

    private enum BPS {PCM_16Bit = 16, PCM_24Bit = 24};

    /// <summary>
    /// Converting the Sample Buffer to the Byte Buffer
    /// </summary>
    /// <param name="samples"></param>
    /// <param name="format"></param>
    /// <returns></returns>
    private byte[] samplesToVawe(float[] samples, WaveFormat format)
    {
        Int32 intSample;
        UInt32 sample4Byte;
        byte[] byteBuffer = new byte[samples.Length * (format.BitsPerSample / 8)];
        uint byteBufIndex = 0;

        for (uint i = 0; i < samples.Length; i++)
        {
            //convert 1 sample into 4 byte integer
            intSample = (Int32)(samples[i] * Int32.MaxValue);
            sample4Byte = (UInt32)intSample;

            switch((BPS)format.BitsPerSample)
            {
                case BPS.PCM_24Bit:
                    byteBuffer[byteBufIndex++] = (byte)(sample4Byte >> 8);
                    byteBuffer[byteBufIndex++] = (byte)(sample4Byte >> 16);
                    byteBuffer[byteBufIndex++] = (byte)(sample4Byte >> 24);
                    break;

                case BPS.PCM_16Bit:
                    byteBuffer[byteBufIndex++] = (byte)(sample4Byte >> 16);
                    byteBuffer[byteBufIndex++] = (byte)(sample4Byte >> 24);
                    break;
            }                
        }

        return byteBuffer;
    }
私有枚举BPS{PCM_16Bit=16,PCM_24Bit=24};
/// 
///将示例缓冲区转换为字节缓冲区
/// 
/// 
/// 
/// 
专用字节[]采样数Tovawe(浮点[]采样数,波形格式)
{
Int32-intSample;
UInt32采样4字节;
byte[]byteBuffer=新字节[samples.Length*(format.BitsPerSample/8)];
uint-bytebuffindex=0;
对于(uint i=0;i>8);
byteBuffer[byteBufIndex++]=(字节)(样本4字节>>16);
byteBuffer[byteBufIndex++]=(字节)(样本4字节>>24);
打破
案例BPS.PCM_16位:
byteBuffer[byteBufIndex++]=(字节)(样本4字节>>16);
byteBuffer[byteBufIndex++]=(字节)(样本4字节>>24);
打破
}                
}
返回缓冲区;
}