从.net中的NAudio保存修改过的WaveChannel32

时间:2014-03-26 11:26:05

标签: c# .net wav naudio

我将音频文件保存在硬盘上有问题。 我正在使用Naudio的WaveChannel32类对我播放的声音进行泛音效果。 我想将更改的Pan值保存在磁盘上。 但是当我想要保存时,它是一个无穷无尽的流,文件长大为大数据Wav文件。 这是我使用它的代码:

制作流:

        if (dialog.FileName.EndsWith(".mp3"))
        {
            pcm = NAudio.Wave.WaveFormatConversionStream.CreatePcmStream(new NAudio.Wave.Mp3FileReader(dialog.FileName));

        } else if (dialog.FileName.EndsWith(".wav")) {
            pcm = new NAudio.Wave.WaveChannel32(new NAudio.Wave.WaveFileReader(dialog.FileName));               
        }

        stream = new NAudio.Wave.BlockAlignReductionStream(pcm); 

        if (stream == null) return;

        /* Wave Channel new instance (Pan) */
        wave_channel = new WaveChannel32(stream);
        wave_channel.Pan = panSlider1.Pan;

        /* Volume Meter */
        sample_channel = new SampleChannel(wave_channel, true);
        sample_channel.PreVolumeMeter += OnPostVolumeMeter;

        realtime_stream = new MeteringSampleProvider(sample_channel);
        realtime_stream.StreamVolume += OnPostVolumeMeter;

        /* Wave out initialize */
        wavo = new WaveOut();
        wavo.Init(realtime_stream);
        wavo.Stop();

        /* Volume Slider */
        sample_channel.Volume = volumeSlider1.Volume;

保存wav文件代码,我尝试将WaveChannel32投射到WaveStream

            WaveStream ch = wave_channel; 
            long outputLenght = 0; 

            using (var writer = new WaveFileWriter(save_file_dialog.FileName + ".wav", ch.WaveFormat)) { 
                byte[] buffer = new byte[ch.WaveFormat.AverageBytesPerSecond * 4]; 
                while (true) { 
                    int bytesread = ch.Read(buffer, 0, buffer.Length); 
                    if (bytesread == 0) { 
                        break; 
                    } 
                    outputLenght += bytesread; 
                    if (outputLenght > Int32.MaxValue) { 
                        throw new InvalidOperationException("Plik nie może być większy niż 2GB"); 
                    }
                    Console.WriteLine(buffer.Length);
                    Console.WriteLine(bytesread);
                    writer.Write(buffer, 0, bytesread); 
                } 
            } 

如何将其与原始硬盘同时保存在硬盘上?

0 个答案:

没有答案