2014-03-05 33 views
0

我想从Kinect录制音频。我正在使用NAudio库。如何用NAudio录制来自Kinect的音频

我发现这个代码:

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(); 

我怎样才能改变button2_click方法接受语音串流?

+0

因为button2_click作为一个事件,它必须有你提供的方法签名。所以除了重写按钮类实现click事件的自定义事件 –

+0

好了,但我可以使用audioStream和全局变量,所以我不能使用额外的参数来传递这个事件,所以我可以使用它 – bircastri

回答

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参数,因为我不知道之前的文件音频的持续时间,我该如何修改它?