【问题标题】:How to Mix 2 wav files together?如何将 2 个 wav 文件混合在一起?
【发布时间】:2017-02-07 19:12:51
【问题描述】:

我正在尝试录制输入并将其与歌曲合并(不连接)。我有一把吉他,是在听歌时录制的,我想把吉他放在歌曲上(比如 audcaity)。 有什么办法吗?如果无法实时混音 - 录制后是否可以合并它们?就像我录制了吉他之后,现在它是一个 wav 文件,我想将 2 个 wav 文件混合在一起。 那是输入设备:

 private void Capture()
    {
        input = new WasapiCapture((MMDevice)inputCombo.SelectedItem);
        bufferedWaveProvider = new BufferedWaveProvider(input.WaveFormat);
        input.DataAvailable += WaveInOnDataAvailable;
        input.StartRecording();
        write = new WaveFileWriter(System.IO.Path.GetTempFileName(), input.WaveFormat);
    }

 private void WaveInOnDataAvailable(object sender, WaveInEventArgs e)
    {
        bufferedWaveProvider.AddSamples(e.Buffer, 0, e.BytesRecorded);
        write.Write(e.Buffer, 0, e.BytesRecorded);
        write.Flush();
    }

我不想将其写入空白文件,而是将其写入已经存在的 wav 文件,而不是覆盖它。 MixingSampleProvider 有可能吗?

【问题讨论】:

    标签: c# audio naudio


    【解决方案1】:

    WaveMixerStream32 应该可以做到这一点,例如这样

    var mixer = new WaveMixerStream32 { AutoStop = true};
    
    var wav1 = new WaveFileReader(@"c:\...\1.wav");
    var wav2 = new WaveFileReader(@"c:\...\2.wav");
    
    mixer.AddInputStream(new WaveChannel32(wav1));
    mixer.AddInputStream(new WaveChannel32(wav2));
    WaveFileWriter.CreateWaveFile("mixed.wav", new Wave32To16Stream(mixer));
    

    【讨论】:

      【解决方案2】:

      要使用MixingSampleProvider 混合多个ISampleProvider 源,您可以执行以下操作:

      这里SignalGenerator 有一个Gain 属性,允许指定它在混音中的响度。

      using System;
      using NAudio.Wave;
      using NAudio.Wave.SampleProviders;
      
      namespace ConsoleApplication1
      {
          internal class Program
          {
              private static void Main(string[] args)
              {
                  ISampleProvider provider1 = new SignalGenerator
                  {
                      Frequency = 1000.0f,
                      Gain = 0.5f
                  };
      
                  ISampleProvider provider2 = new SignalGenerator
                  {
                      Frequency = 1250.0f,
                      Gain = 0.5f
                  };
      
                  var takeDuration1 = TimeSpan.FromSeconds(5); // otherwise it would emit indefinitely
                  var takeDuration2 = TimeSpan.FromSeconds(10);
      
                  var sources = new[]
                  {
                      provider1.Take(takeDuration1),
                      provider2.Take(takeDuration2)
                  };
      
                  var mixingSampleProvider = new MixingSampleProvider(sources);
      
                  var waveProvider = mixingSampleProvider.ToWaveProvider();
      
                  WaveFileWriter.CreateWaveFile("test.wav", waveProvider);
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2020-01-26
        • 1970-01-01
        • 1970-01-01
        • 2022-10-06
        • 1970-01-01
        • 1970-01-01
        • 2016-09-20
        • 2014-05-03
        • 2011-10-10
        相关资源
        最近更新 更多