2013-01-07 2 views
3

я пытался настроить этот образец Wav записи: http://channel9.msdn.com/Series/KinectQuickstart/Audio-FundamentalsЗапись аудио с Kinect

Для нового SDK (версии 1.6) и по какой-то причине - результирующий файл .wav недействителен

В Init:

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

     // Use a separate thread for capturing audio because audio stream read operations 
     // will block, and we don't want to block main UI thread. 
     this.readingThread = new Thread(AudioReadingThread); 
     this.readingThread.Start(); 
     fileStream = new FileStream(@"d:\temp\temp.wav", FileMode.Create); 

     int rec_time = (int) 20 * 2 * 16000;//20 sec 
     WriteWavHeader(fileStream, rec_time); 

нить:

private void AudioReadingThread() 
    { 

     while (this.reading) 
     { 
       int readCount = audioStream.Read(audioBuffer, 0, audioBuffer.Length); 

       fileStream.Write(audioBuffer, 0, readCount); 
     } 
    } 

Wav Заголовок:

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)) 
      { 
       bw.Write(dataLength + cbFormat + 4); //File size - 8 
       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 
       bw.Write(dataLength); 
       memStream.WriteTo(stream); 
      } 
     } 
    } 
+0

является 'this.audioStream' в противном случае действует? Как вы настраиваете датчик? –

+0

Код запускается без исключений, датчик установлен, а wav-файл не пуст. Просто формат, вероятно, кривоватый –

+0

вы можете отправить мне полученный файл? У меня возникли проблемы с настройкой этого кода для запуска, пытаясь достичь той же цели. Какими пространствами имен являются классы WAVEFORMATEX и WriteString? Где именно я помещаю в заголовок riff и модификацию memstream в заголовке данных в вашем коде? – Ivan

ответ

2

Вы забыли добавить код для добавления «RIFF Header» в файл. Код просто:

//RIFF header 
WriteString(memStream, "RIFF"); 
bw.Write(dataLength + cbFormat + 4); //File size - 8 
WriteString(memStream, "WAVE"); 
WriteString(memStream, "fmt "); 
bw.Write(cbFormat); 

Вы также забыли изменить memStream на «заголовке данных», вам нужна строка:

WriteString(memStream, "data"); 
Смежные вопросы