2013-01-07 6 views
3

j'ai essayé de régler cet échantillon d'enregistrement Wav: http://channel9.msdn.com/Series/KinectQuickstart/Audio-FundamentalsEnregistrement audio avec Kinect

Pour le nouveau SDK (Ver 1.6) et pour une raison quelconque - le fichier .wav résultant est invalide

Dans le 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); 

Le fil:

private void AudioReadingThread() 
    { 

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

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

Wav tête:

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

est 'this.audioStream' par ailleurs valide? Comment installez-vous votre capteur? –

+0

Le code s'exécute sans exception, le capteur est défini et le fichier wav n'est pas vide. Juste le format est probablement tordu –

+0

pouvez-vous m'envoyer votre fichier résultant? J'ai de la difficulté à mettre ce code en place en essayant d'atteindre le même objectif. De quels espaces de noms proviennent les classes WAVEFORMATEX et WriteString? Où exactement dois-je mettre dans l'entête riff et la modification de memstream à l'en-tête de données dans votre code? – Ivan

Répondre

2

Vous avez oublié d'ajouter le code pour ajouter "RIFF Header" au fichier. Le code est aussi simple que:

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

Vous avez oublié aussi de modifier memStream au "tête de données", vous avez besoin de la ligne:

WriteString(memStream, "data");