Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为多个通道写入wav标头_C#_Audio_Kinect_Wav - Fatal编程技术网

C# 为多个通道写入wav标头

C# 为多个通道写入wav标头,c#,audio,kinect,wav,C#,Audio,Kinect,Wav,在使用Kinect录制音频数据之后,我编写了一个WriteWavHeader()方法,该方法适用于1个通道(PCM,采样率:16 kHz,位/采样率:16)。问题是,当我尝试用立体声录音时(nChannels=2),音轨的速度似乎加倍了!你知道我做错了什么吗 static void WriteWavHeader(Stream stream, int dataLength) { using (var memStream = new MemoryStream(64)) {

在使用Kinect录制音频数据之后,我编写了一个
WriteWavHeader()
方法,该方法适用于1个通道(PCM,采样率:16 kHz,位/采样率:16)。问题是,当我尝试用立体声录音时(
nChannels=2
),音轨的速度似乎加倍了!你知道我做错了什么吗

static void WriteWavHeader(Stream stream, int dataLength)
{
    using (var memStream = new MemoryStream(64))
    {
        int cbFormat = 16; //sizeof(WAVEFORMATEX)
        WAVEFORMATEX format = new WAVEFORMATEX()
        {
            //Subchunk1Size ==  16 for PCM.
            wFormatTag = 1,

            //NumChannels  :    Mono = 1, Stereo = 2, etc.
            nChannels = 2,

            //SampleRate       8000, 44100
            nSamplesPerSec = 16000,

            //ByteRate         == SampleRate * NumChannels * BitsPerSample/8
            nAvgBytesPerSec = 32000*2,

            //BlockAlign       == NumChannels * BitsPerSample/8
            nBlockAlign = 2*2,

            //BitsPerSample    8 bits = 8, 16 bits = 16, etc.
            wBitsPerSample = 16
        };

        using (var binarywriter = new BinaryWriter(memStream))
        {
            //RIFF header
            WriteString(memStream, "RIFF");
            binarywriter.Write(dataLength+8 + cbFormat+8 + 4); 
            WriteString(memStream, "WAVE");
            WriteString(memStream, "fmt ");
            binarywriter.Write(cbFormat);

            //WAVEFORMATEX
            binarywriter.Write(format.wFormatTag);
            binarywriter.Write(format.nChannels);
            binarywriter.Write(format.nSamplesPerSec);
            binarywriter.Write(format.nAvgBytesPerSec);
            binarywriter.Write(format.nBlockAlign);
            binarywriter.Write(format.wBitsPerSample);

            //data header
            WriteString(memStream, "data");

            binarywriter.Write(dataLength);
            memStream.WriteTo(stream);
        }
    }
}
以及记录方法:

public void RecordAudio()
{
    //Subchunk2Size    == NumSamples * NumChannels * BitsPerSample/8
    int recordingLength = 5 *16000* 2 *2;
    byte[] buffer = new byte[1024];

    using (FileStream _fileStream = new FileStream("c:\\kinectAudio.wav", FileMode.Create))
    {
        WriteWavHeader(_fileStream, recordingLength);
        int count, totalCount = 0;
        //Start capturing audio                               
        using (Stream audioStream = this.sensor.AudioSource.Start())
        {

            while ((count = audioStream.Read(buffer, 0, buffer.Length)) > 0 && totalCount < recordingLength)
            {
                _fileStream.Write(buffer, 0, count);
                totalCount += count;
            }
        }
         //write the real wav header
        long prePosition = _fileStream.Position;
        _fileStream.Seek(0, SeekOrigin.Begin);
        WriteWavHeader(_fileStream, totalCount);
        _fileStream.Seek(prePosition, SeekOrigin.Begin);
        _fileStream.Flush();         
    }
}
public void RecordAudio()
{
//Subchunk2Size==NumSamples*NumChannels*BitsPerSample/8
int-recordingLength=5*16000*2*2;
字节[]缓冲区=新字节[1024];
使用(FileStream\u FileStream=newfilestream(“c:\\kinectAudio.wav”,FileMode.Create))
{
WriteWavHeader(_fileStream,recordingLength);
整数计数,总计数=0;
//开始捕获音频
使用(Stream audioStream=this.sensor.AudioSource.Start())
{
while((count=audioStream.Read(buffer,0,buffer.Length))>0&&totalCount
使用音频源时如何指定立体声?从中,我看不到任何实际更改捕获格式的方法。也找不到。事实上,我在这里开始了一个主题,关于如何指定所需的麦克风使用,但没有得到任何反馈。。。在标题上指定nChannels=2然而,当我在Audacity中打开wav文件时,我得到的结果如下:(如果仔细看,两个通道略有不同),这意味着输出是立体声的,所以我想我在ByteRate/dataLength方面出了问题,但无法理解..仅仅因为你在Audacity中看到两个频道并不意味着你在节目中录制的源是立体声的-它只是意味着你已经通过将其保存在标题中来告诉它是立体声的。我只是略作猜测,但audacity可能会将样本1解释为左声道样本1,样本2解释为右声道样本1,样本3解释为左声道样本2,样本4解释为右声道样本2,等等-结果是,每个声道的输出都会略有不同,它会播放双速。是的,这似乎是对的。问题是,正如我所检查的,可以使用Audacity在立体声中使用Kinect进行录制(我非常确定Audacity可以使用适当的声卡录制4个不同的曲目),但是这个.sensor.AudioSource.Start()似乎只在单声道中录制。。。有什么胡乱猜测吗?对不起,我唯一的消息来源是那些文档,我觉得它们没有多大帮助!