代码之家  ›  专栏  ›  技术社区  ›  Alen

用NAudio混合波流

  •  0
  • Alen  · 技术社区  · 11 年前

    过去几天,我一直在使用NAudio,将两个波形文件混合为这种格式:

    采样率:8000 每个样本位数:8 频道:1 块对齐通道:1 每秒位数:8000

    正如我从 https://naudio.codeplex.com/discussions/251475 ,首先我应该将它们转换为32位ieeefloatingpoint编码,然后将转换后的流添加到WaveMixerStream32。之后,我应该使用Wave32To16Stream将混合数据转换为16bit/采样流,将获得的流转换为单声道,最后将单声道16bit/样本转换为单音节8bit/样本。

    我根据我的解释编写了这些代码行:

        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 0 32 6 0 0 59 126 0 59 126。。。 但是在应用Wave32To16Stream之后,我在stereo16和mono16中有一个只有零的序列!! 这一步我该怎么做?

    1 回复  |  直到 10 年前
        1
  •  0
  •   Alen    10 年前

    答案比我想象的要简单。我只需要将ALaw转换为PCM,然后 添加两个波流,我使用G711代码项目文章中的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
    }
    
    推荐文章
    Alen  ·  用NAudio混合波流
    11 年前