C# 为多个通道写入wav标头
在使用Kinect录制音频数据之后,我编写了一个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)) {
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()似乎只在单声道中录制。。。有什么胡乱猜测吗?对不起,我唯一的消息来源是那些文档,我觉得它们没有多大帮助!