gpt4 book ai didi

c# - 可以正确读取WAV文件的数据

转载 作者:行者123 更新时间:2023-12-03 01:56:46 26 4
gpt4 key购买 nike

我正在尝试阅读 wav file如下

class Program
{
struct WavHeader
{
public int riffID;
public int size;
public int wavID;
public int fmtID;
public int fmtSize;
public int format;
public int channels;
public int sampleRate;
public int bytePerSec;
public int blockSize;
public int bit;
public int dataID;
public int dataSize;
}
static void Main(string[] args)
{
WavHeader Header = new WavHeader();
List<short> lDataList = new List<short>();
List<short> rDataList = new List<short>();

using (FileStream fs = new FileStream(@"D:\Test.wav", FileMode.Open, FileAccess.Read))
using (BinaryReader br = new BinaryReader(fs))
{
try
{
Header.riffID = br.ReadInt32();
Header.size = br.ReadInt32();
Header.wavID = br.ReadInt32();
Header.fmtID = br.ReadInt32();
Header.fmtSize = br.ReadInt32();
Header.format = br.ReadUInt16();
Header.channels = br.ReadUInt16();
Header.sampleRate = br.ReadInt32();
Header.bytePerSec = br.ReadInt32();
Header.blockSize = br.ReadInt16();
Header.bit = br.ReadInt16();

if (Header.fmtSize == 18)
{
// Read any extra values
int fmtExtraSize = br.ReadInt16();
br.ReadBytes(fmtExtraSize);
}
Header.dataID = br.ReadInt32();
Header.dataSize = br.ReadInt32();

int bytesForSamp = Header.bit / 8;
int samps = Header.dataSize / bytesForSamp;


for (int i = 0; i < samps; i++)
{
lDataList.Add((short)br.ReadUInt16());
rDataList.Add((short)br.ReadUInt16());
}


}
finally
{
if (br != null)
{
br.Close();
}
if (fs != null)
{
fs.Close();
}
}
}
}
}

但是在出现运行时错误
lDataList.Add((short)br.ReadUInt16());
rDataList.Add((short)br.ReadUInt16());

{“无法读取超出流末尾的内容。”}

我看过这个 SO Q/A并尝试按照要求进行调整,但这会返回 float 。

最佳答案

在这里,您可以正确计算每个样本的字节数和样本数:

int bytesForSamp = Header.bit / 8;
int samps = Header.dataSize / bytesForSamp;

但在这里您假设该文件有 2 个 channel 和 16 位样本:
for (int i = 0; i < samps; i++)
{
lDataList.Add((short)br.ReadUInt16());
rDataList.Add((short)br.ReadUInt16());
}

如果文件实际上有 8 位样本和/或只有 1 个 channel ,则此循环会尝试在某个点读取输入文件之外的内容。
您要么必须断言,在读取 header 后文件实际上是 16 位 2ch,要么通过根据波形文件 header 中指定的每个样本的位数和 channel 正确读取来正确处理文件。

关于c# - 可以正确读取WAV文件的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34701101/

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