【发布时间】:2013-12-20 16:01:55
【问题描述】:
WriteWavHeader 函数实现了 WAV 标头。问题是当我尝试在 Matlab 中使用wavread 读取 WAV 文件时,我失败了。通过在wavread 中添加断点,我检查了尽管Matlab 可以很好地读取“WAVE”、“fmt”和“数据”标头(即ck.ID 等于'WAVE'、'fmt ' 和@ 987654327@ 分别在每次迭代中),它无法正确读取'end of file' 字符串。具体来说,ck.ID 等于一堆奇怪的 ASCII 字符。当我对ck.ID = 'end of file' 进行硬编码时,我设法读取了 wav 文件。有关如何解决此问题的任何想法?
static void WriteWavHeader(Stream stream, int dataLength)
{
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 binarywriter = new BinaryWriter(memStream))
{
//RIFF header
WriteString(memStream, "RIFF");
binarywriter.Write(dataLength + 8 + cbFormat + 8 + 4); //File size - 8
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);
binarywriter.Write(format.cbSize);
//data header
WriteString(memStream, "data");
binarywriter.Write(dataLength);
memStream.WriteTo(stream);
WriteString(memStream, "end of file");
}
}
}
static void WriteString(Stream stream, string s)
{
byte[] bytes = Encoding.ASCII.GetBytes(s);
stream.Write(bytes, 0, bytes.Length);
}
【问题讨论】: