gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 07:57:12 24 4
gpt4 key购买 nike

作为学习 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));
}

最佳答案

主要问题是:

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

你应该做什么:

将字符串转成字节,然后直接写入字节。

byte[] data = System.Text.Encoding.ASCII.GetBytes("RIFF");
binaryWriter.Write(data);

或者让它成为一行:

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

可能还有其他问题,比如你写的整数可能与要求的大小不一样。你应该仔细检查它们。

至于字节序,您放置的链接指出数据采用小端字节序,BinaryWriter 使用小端字节序,因此这应该不是问题。

关于c# - 在 C# 中创建 .wav 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14659684/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com