Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.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# 在C中创建.wav文件#_C#_Wav - Fatal编程技术网

C# 在C中创建.wav文件#

C# 在C中创建.wav文件#,c#,wav,C#,Wav,作为学习C#的借口,我一直在尝试编写一个简单的项目:创建音频文件。首先,我要确保我可以编写符合WAVE格式的文件。我曾在网上研究过该格式(例如),但每当我尝试回放文件时,它都无法正确打开。这是我的密码。有什么遗漏或不正确的吗 uint numsamples = 44100; ushort numchannels = 1; ushort samplelength = 1; // in bytes uint samplerate = 22050; FileStream f = new FileSt

作为学习C#的借口,我一直在尝试编写一个简单的项目:创建音频文件。首先,我要确保我可以编写符合WAVE格式的文件。我曾在网上研究过该格式(例如),但每当我尝试回放文件时,它都无法正确打开。这是我的密码。有什么遗漏或不正确的吗

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));
}
uint numsamples=44100;
ushort numchannels=1;
ushort samplelength=1;//以字节为单位
uint采样器=22050;
FileStream f=newfilestream(“a.wav”,FileMode.Create);
BinaryWriter wr=新的BinaryWriter(f);
wr.Write(“RIFF”);
wr.Write(36+numsamples*numchannels*samplelength);
wr.Write(“wavemt”);
wr.Write(16);
wr.Write((ushort)1);
wr.Write(numchannels);
wr.Write(采样器);
wr.Write(samplerate*samplelength*numchannels);
wr.Write(采样长度*数字通道);
wr.Write((ushort)(8*样本长度));
wr.写入(“数据”);
wr.Write(numsamples*samplelength);
//现在,只是一个方波
波形a=新波形(440,50);
双t=0.0;
对于(int i=0;i
我缺少正确的WAV数据,但请尝试用此代码替换生成标题的代码部分(适当替换):


主要问题是:

BinaryReader
写入一个前缀为其长度的字符串,以便将其读回。它不打算像您的案例那样使用。您需要直接写入字节,而不是使用
BinaryWriter.write(string)

你应该做什么:

将字符串转换为字节,然后直接写入字节

byte[] data = System.Text.Encoding.ASCII.GetBytes("RIFF");
binaryWriter.Write(data);
或者只写一行:

binaryWriter.Write(System.Text.Encoding.ASCII.GetBytes("RIFF"));

还可能存在其他问题,例如您正在写入的整数可能与所需的大小不同。你应该仔细检查


至于endian,您放置的链接表明数据是小endian格式的,
BinaryWriter
使用小endian,因此这应该不是问题。

最简单的方法是,您可以简单地更改:

wr.Write("RIFF");
致:


在二进制文件中写入字符串时,它将包括字符串的长度,以便以后可以将其反序列化回字符串。在这种情况下,您只需要将四个字节写入四个字节,并将其转换为字符数组即可。

@Alvin wong answer非常适合。我只是想添加另一个建议,不过还有几行:

binaryWriter.Write('R');
binaryWriter.Write('I');
binaryWriter.Write('F');
binaryWriter.Write('F'); 

“它不能正确打开”是什么意思?请指出确切的错误或异常。当我尝试播放时,上面的代码会生成此错误消息:“Windows Media Player无法播放该文件。该播放器可能不支持该文件类型,或者可能不支持用于压缩该文件的编解码器。”但随后我将文本输出更改为分别写入每个字符(我猜是字符串,他们放入了空终止符,这破坏了对齐)。在这些更改之后,当我尝试播放它时,会弹出另一条错误消息:“Windows Media Player在播放文件时遇到问题。”这实际上是我的第二次尝试。我的第一次尝试使用了更精确的代码(我使用了一个字节数组,并分别分配每个字节,以跟踪尾数),然后将数组内容写入文件。但这次尝试给出了我提到的第一条错误消息。在尝试播放文件之前,您是否正确关闭了流?或者您可以使用。我收到一个错误(我上面提到的第二个错误)。这可能是我的数据,但我非常确定写入文件的字节数是正确的,所以最坏的结果应该是噪音。我甚至将最后一行更改为与其他字符串相同的格式。我重新安排了一些内容(例如,我不了解您的块大小,所以我使用了我的),结果确实有效!我不知道为什么。也许C#或Visual Studio的默认值不是ASCII?无论如何,谢谢你。是的,我正试图制作自己的录音机用于谷歌的语音识别(类似于桌面助手)。我花了几个小时的时间仔细检查了WAV格式的细节。很高兴你弄明白了。我修复了它。我想我需要用ASCII编码。正如我在评论中提到的,我最初尝试使用字节数组并单独处理每个字节(就像我在用C工作一样)。就是在这个设置中,我明确地处理了endianess(通过移位和隔离一个字节并存储在正确的索引中)。无论如何,谢谢你。不,gross!不要这样做
wr.Write("RIFF".ToArray());
binaryWriter.Write('R');
binaryWriter.Write('I');
binaryWriter.Write('F');
binaryWriter.Write('F');