如何用Kinect和NAudio录制音频

时间:2014-03-05 16:16:49

标签: c# kinect naudio

我想录制Kinect的音频。我正在使用NAudio库。

我找到了这段代码:

private void button2_Click(object sender, EventArgs e) //Play Button
{
  fileName = "lastReplay.wav";            

  FileStream FS_Write = File.OpenWrite("lastReplay.wav");
  FS_Write.Close();

  int deviceNumber = sourceList.SelectedItems[0].Index;

  sourceStream = new NAudio.Wave.WaveIn();
  sourceStream.DeviceNumber = deviceNumber;
  sourceStream.WaveFormat = new NAudio.Wave.WaveFormat(44100,  
      NAudio.Wave.WaveIn.GetCapabilities(deviceNumber).Channels);

  NAudio.Wave.WaveInProvider waveIn = new
      NAudio.Wave.WaveInProvider(sourceStream);

  sourceStream.DataAvailable += new EventHandler<NAudio.Wave.WaveInEventArgs>
      (sourceStream_DataAvailable);
  waveWriter = new NAudio.Wave.WaveFileWriter(fileName, sourceStream.WaveFormat);
  sourceStream.StartRecording();
}


private void sourceStream_DataAvailable(object sender, NAudio.Wave.WaveInEventArgs e)
{
  if (waveWriter == null) return;
  waveWriter.Write(e.Buffer, 0, e.BytesRecorded);
  waveWriter.Flush();
}

当我启动kinect时,需要启动音频通道,所以我使用它:

Stream audioStream  = this.sensor.AudioSource.Start();

如何更改接受audioStream的button2_click方法?

1 个答案:

答案 0 :(得分:0)

我已经解决了我的问题,代码是这样的:

   static void WriteWavHeader(Stream stream, int dataLength)
        {
            //We need to use a memory stream because the BinaryWriter will close the underlying stream when it is closed
            using (var memStream = new MemoryStream(64))
            {
                int cbFormat = 18; //sizeof(WAVEFORMATEX)
                WAVEFORMATEX format = new WAVEFORMATEX()
                {
                    wFormatTag = 1,
                    nChannels = 1,
                    nSamplesPerSec = 16000,
                    nAvgBytesPerSec = 32000,
                    nBlockAlign = 2,
                    wBitsPerSample = 16,
                    cbSize = 0
                };

                using (var bw = new BinaryWriter(memStream))
                {
                    //RIFF header
                    WriteString(memStream, "RIFF");
                    bw.Write(dataLength + cbFormat + 4); //File size - 8
                    WriteString(memStream, "WAVE");
                    WriteString(memStream, "fmt ");
                    bw.Write(cbFormat);

                    //WAVEFORMATEX
                    bw.Write(format.wFormatTag);
                    bw.Write(format.nChannels);
                    bw.Write(format.nSamplesPerSec);
                    bw.Write(format.nAvgBytesPerSec);
                    bw.Write(format.nBlockAlign);
                    bw.Write(format.wBitsPerSample);
                    bw.Write(format.cbSize);

                    //data header
                    WriteString(memStream, "data");
                    //bw.Write(dataLength);
                    bw.Write(dataLength);
                    memStream.WriteTo(stream);
                }
            }
        }

但是这个方法我应该在文件音频时间之前知道。我把dataLength参数。如果我使用这个代码就找到但是现在我想使用这个方法永远不会是dataLength参数,因为我不知道在文件Audio的持续时间之前,我怎么能修改它?