C# NAudio混合波流

C# NAudio混合波流,c#,naudio,wave,C#,Naudio,Wave,在过去的几天里,我一直在使用NAudio将两个wave文件以这种格式混合在一起: 采样器:8000 位示例:8 频道:1 块对齐通道:1 每秒比特数:8000 正如我从中发现的,首先我应该将它们转换为32位ieeefloatingpoint编码,然后将转换后的流添加到WaveMixerStream32。之后,我应该使用Wave32To16Stream将混合数据转换为16位/采样流,将获得的流转换为mono,最后将mono 16位/采样转换为mono 8位/采样 我根据我的解释编写了以下代码行:

在过去的几天里,我一直在使用NAudio将两个wave文件以这种格式混合在一起:

采样器:8000 位示例:8 频道:1 块对齐通道:1 每秒比特数:8000

正如我从中发现的,首先我应该将它们转换为32位ieeefloatingpoint编码,然后将转换后的流添加到WaveMixerStream32。之后,我应该使用Wave32To16Stream将混合数据转换为16位/采样流,将获得的流转换为mono,最后将mono 16位/采样转换为mono 8位/采样

我根据我的解释编写了以下代码行:

    WaveFileReader r1 = new WaveFileReader(...);
    WaveFileReader r2 = new WaveFileReader(...);

    WaveFormat OutputWaveFormat = WaveFormat.CreateCustomFormat(WaveFormatEncoding.Pcm, 8000, 1, 16000, 2, 16);
    WaveFormat InputWaveFormat = WaveFormat.CreateALawFormat(8000, 1);

    WaveFormatConversionStream ConversionStream1 = new WaveFormatConversionStream(OutputWaveFormat, r1);
    WaveFormatConversionStream ConversionStream2 = new WaveFormatConversionStream(OutputWaveFormat, r2);

    WaveChannel32 WaveChannel32_1 = new WaveChannel32(ConversionStream1);
    WaveChannel32 WaveChannel32_2 = new WaveChannel32(ConversionStream2);

    WaveMixerStream32 mixer32 = new WaveMixerStream32();
    mixer32.AddInputStream(WaveChannel32_1);

    mixer32.AddInputStream(WaveChannel32_2);//(*)

    Wave32To16Stream stereo16 = new Wave32To16Stream(mixer32);
    StereoToMonoProvider16 mono16 = new StereoToMonoProvider16(m_Wave32To16Stream);
在第*行之后,我有一个流,例如:0 0 32 60 0 32 60 0 0 59 126 0 59 126。。。 但在将Wave32应用到16流之后,我在stereo16和mono16中只得到了一个零序列!!
这一步我该怎么办?

答案比我想象的要简单。我只需要将ALaw转换为PCM,然后 添加两个wave流,我使用G711 codeproject文章中的ALawDecoder完成了这项工作

r1 = new WaveFileReader(...);
r2 = new WaveFileReader(...);
r1.Read(arr1, 0, arr1.Length);    
r2.Read(arr2, 0, arr2.Length);
short[] firstPCM16 = ALawDecoder.ALawDecode(arr1);
short[] secondPCM16 = ALawDecoder.ALawDecode(arr2);
byte[] result1 = new byte[firstPCM16.Length * sizeof(short)];
byte[] result1 = new byte[secondPCM16.Length * sizeof(short)];
Buffer.BlockCopy(firstPCM16, 0, result1, 0, result1.Length);
Buffer.BlockCopy(secondPCM16, 0, result2, 0, result2.Length);
for (...)
{                        
    mixed[i] = (byte)(result1[i] + result2[i]);//No need to dividing by 2 because r1  and r2 are 8 bit ALaw and return value of ALawDecoder is 16 bit pcm
}