2015-09-07 68 views
0

我想记录来自Kinect的音频流并将其保存在我的电脑中,所以我在这里引用示例代码。 http://channel9.msdn.com/Series/KinectQuickstart/Audio-Fundamentals通过WAVEFORMATEX从Kinect录制音频

这是我的部分代码。

public static void WriteWavHeader(Stream stream, int dataLength) 
     { 

      using (var memStream = new MemoryStream(64)) 
      { 
       int cbFormat = 18; //sizeof(WAVEFORMATEX) 
       WAVEFORMATEX format = new WAVEFORMATEX() 
       { 
        //wFormatTag = 0, 
        nChannels = 1, 
        nSamplesPerSec = 16000, 
        nAvgBytesPerSec = 32000, 
        nBlockAlign = 2, 
        wBitsPerSample = 16, 
        cbSize = 0 
       }; 

       using (var bw = new BinaryWriter(memStream)) 
       { 
        //RIFF header    
        WriteString(memStream, "data"); 
        bw.Write(cbFormat); 
        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); 
        memStream.WriteTo(stream); 
       } 
      } 
     } 

在行“bw.Write(format.wFormatTag);”中出现错误。当我编译代码时,WAVEFORMATEX中的其他行没有错误时,我已将“Bass.Net”添加到我的引用并使用“Un4seen.Bass”,但我仍无法修复它。

+0

错误行显示“无法传输从'Un4seen.Bass.WAVEFormatTag'bool'“ – Tony

+0

根据http://www.bass.radio42.com/help/html/56c44e65-9b99-fa0d-d74a-3d9de3b01e89.htm WAVEFormatTag是一个枚举值。将其重新转换为正确大小的数字。我不知道它应该是一个'short'还是'int'或其他什么,你需要试一试。所以'bw.Write((short)format.wFormatTag)''可以工作。 –

+0

非常感谢,它的工作原理。 – Tony

回答

0

看来你在混合几个不同的SDK。在你提供的链接,该WAVEFORMATEX定义如下:

struct WAVEFORMATEX 
{ 
    public ushort wFormatTag; 
    public ushort nChannels; 
    public uint nSamplesPerSec; 
    public uint nAvgBytesPerSec; 
    public ushort nBlockAlign; 
    public ushort wBitsPerSample; 
    public ushort cbSize; 
} 

所以,不枚举值或Un4seen.Bass引用。的函数写头文件是略低不同(仅在wFormatTag值不同):

/// <summary> 
/// A bare bones WAV file header writer 
/// </summary>   
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); 
      memStream.WriteTo(stream); 
     } 
    } 
} 

WriteString也需要将其转换成ASCII的护理。我引用上述演示文稿中引用的.zip文件(“下载Quickstart slides and samples”,KinectforWindowsSDKV1 \ 6.Audio \ AudioRecorder \ AudioRecorder \ MainWindow.xaml.cs)