【发布时间】:2013-01-17 13:19:56
【问题描述】:
作为学习 C# 的借口,我一直在尝试编写一个简单的项目:创建音频文件。首先,我想确保我可以编写符合 WAVE 格式的文件。我在网上研究过格式(例如here),但是每当我尝试播放文件时,它都无法正确打开。这是我的代码。有什么遗漏或不正确吗?
uint numsamples = 44100;
ushort numchannels = 1;
ushort samplelength = 1; // in bytes
uint samplerate = 22050;
FileStream f = new FileStream("a.wav", FileMode.Create);
BinaryWriter wr = new BinaryWriter(f);
wr.Write("RIFF");
wr.Write(36 + numsamples * numchannels * samplelength);
wr.Write("WAVEfmt ");
wr.Write(16);
wr.Write((ushort)1);
wr.Write(numchannels);
wr.Write(samplerate);
wr.Write(samplerate * samplelength * numchannels);
wr.Write(samplelength * numchannels);
wr.Write((ushort)(8 * samplelength));
wr.Write("data");
wr.Write(numsamples * samplelength);
// for now, just a square wave
Waveform a = new Waveform(440, 50);
double t = 0.0;
for (int i = 0; i < numsamples; i++, t += 1.0 / samplerate)
{
wr.Write((byte)((a.sample(t) + (samplelength == 1 ? 128 : 0)) & 0xff));
}
【问题讨论】:
-
“无法正确打开”是什么意思?请提及确切的错误或异常。
-
当我尝试播放时,上面的代码会产生此错误消息:“Windows Media Player 无法播放文件。播放器可能不支持文件类型或可能不支持用于压缩的编解码器文件。”但是后来我更改了文本输出以单独编写每个字符(我猜是作为字符串,他们将空终止符放入其中,这会破坏对齐方式)。经过这些更改,当我尝试播放时,会弹出一条不同的错误消息:“Windows Media Player 在播放文件时遇到问题。”
-
这实际上是我的第二次尝试。我的第一次尝试是尝试更精确的代码(我使用字节数组并单独分配每个字节,跟踪字节顺序),然后将数组内容写入文件。但是这种尝试给出了我提到的第一条错误消息。
-
在尝试播放文件之前,您是否正确关闭了流?