namespace ReadWav;
public class ReadControl
{
public string FilePath { get; }
public int ChunkSize { get; private set; }
public int Subchunk1Size { get; private set; }
public short AudioFormat { get; private set; }
public short NumChannels { get; private set; }
public int SampleRate { get; private set; }
public int ByteRate { get; private set; }
public short BlockAlign { get; private set; }
public short BitsPerSample { get; private set; }
public int DataSize { get; private set; }
public ReadControl(string filePath)
{
FilePath = filePath;
}
public void ReadWavHeader()
{
using (var fileStream = new FileStream(FilePath, FileMode.Open, FileAccess.Read))
using (var reader = new BinaryReader(fileStream))
{
// RIFF 块
string riffChunk = new string(reader.ReadChars(4));
if (riffChunk != "RIFF")
throw new FormatException("Not a valid WAV file - RIFF header missing");
ChunkSize = reader.ReadInt32();
string waveFormat = new string(reader.ReadChars(4));
if (waveFormat != "WAVE")
throw new FormatException("Not a valid WAV file - WAVE format missing");
// fmt 子块
string fmtSubchunk = new string(reader.ReadChars(4));
if (fmtSubchunk != "fmt ")
throw new FormatException("Not a valid WAV file - fmt subchunk missing");
Subchunk1Size = reader.ReadInt32();
AudioFormat = reader.ReadInt16();
NumChannels = reader.ReadInt16();
SampleRate = reader.ReadInt32();
ByteRate = reader.ReadInt32();
BlockAlign = reader.ReadInt16();
BitsPerSample = reader.ReadInt16();
// 跳过可能的扩展信息
if (Subchunk1Size > 16)
{
reader.ReadBytes(Subchunk1Size - 16);
}
// 查找 data 子块
while (fileStream.Position < fileStream.Length)
{
string subchunkId = new string(reader.ReadChars(4));
int subchunkSize = reader.ReadInt32();
if (subchunkId == "data")
{
DataSize = subchunkSize;
break;
}
else
{
// 跳过其他子块
reader.ReadBytes(subchunkSize);
}
}
}
}
public void PrintHeaderInfo()
{
Console.WriteLine("WAV File Information:");
Console.WriteLine($"File: {ChunkSize}");
Console.WriteLine($"File: {Path.GetFileName(FilePath)}");
Console.WriteLine($"Audio Format: {(AudioFormat == 1 ? "PCM" : "Compressed")} (Code: {AudioFormat})");
Console.WriteLine($"Channels: {NumChannels}");
Console.WriteLine($"Sample Rate: {SampleRate} Hz");
Console.WriteLine($"Byte Rate: {ByteRate} bytes/sec");
Console.WriteLine($"Block Align: {BlockAlign} bytes");
Console.WriteLine($"Bits Per Sample: {BitsPerSample} bits");
Console.WriteLine($"Data Size: {DataSize} bytes");
Console.WriteLine($"Duration: {CalculateDuration():F2} seconds");
}
private double CalculateDuration()
{
return (double)DataSize / ByteRate;
}
}