通过WAVEFORMATEX从Kinect录制音频

本文关键字:音频 Kinect WAVEFORMATEX 通过 | 更新日期: 2023-09-27 18:11:37

我想记录来自Kinect的音频流并将其保存在我的计算机中,所以我在这里引用了示例代码。http://channel9.msdn.com/Series/KinectQuickstart/Audio-Fundamentals

这是我的部分代码。

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"。

通过WAVEFORMATEX从Kinect录制音频

似乎你混合了几个不同的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文件("下载快速入门幻灯片和示例",KinectforWindowsSDKV1'6.Audio'AudioRecorder'AudioRecorder'MainWindow.xaml.cs)