将特定音量和音高设置为.wav文件

时间:2017-09-18 09:04:29

标签: c# naudio winmm

在我的应用程序中,我需要录制一些wav文件并将它们设置为特定的音量和音高。现在我可以使用 winmm.dll 录制和播放.wav文件,但我不知道如何修改它们。

private void Record()
    {
        mciSendString("open new Type waveaudio Alias recsound", "", 0, 0);
        mciSendString("record recsound", "", 0, 0);            
    }

private void StopRecord(string file)
    {
        string path = "C:\\Users\\Workshop\\Dani\\audiofiles\\audiofiles\\" + this.Name + '\\' + file + ".wav";
        mciSendString("save recsound " + path, "", 0, 0);
        mciSendString("close recsound", "", 0, 0);

    }

private void Reproduce (string path)
    {
        SoundPlayer player = new SoundPlayer(path);
        player.Load();
        player.Play();
    }

我通过搜索互联网看到,使用NAudio.dll可以修改.wav文件,但我还没有完全理解它是如何工作的。

1 个答案:

答案 0 :(得分:0)

通过使用Naudio库,可以获取.wav文件的所有样本并根据需要进行修改。

wave = new NAudio.Wave.WaveFileReader(path);
float[] samples = new float[wave.SampleCount];
a = wave.ReadNextSampleFrame();
int i = 0;
while (a != null)
   {
     samples[i] = a[0]*ratio;
     i++;                
     a = wave.ReadNextSampleFrame();
   }
//create the new .wav with the samples modified
WaveFormat waveFormat = wave.WaveFormat;
wave.Dispose();
WaveFileWriter writer = new WaveFileWriter(path, waveFormat);
for (int u=0; u < i; u++)
  {
     writer.WriteSample(samples[u]);
  }
writer.Dispose();

重要的是要记住,每个样本都是一个浮点数,其值从-1.0f到1.0f。同样重要的是要知道音频被录制了多少个频道,在我的情况下它只是一个频道,这就是我使用[0]的原因,但是如果有更多的频道我应该使用一个[0],A [1],...,A [nChannels]