C#读取WAV的头部信息
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;
    }
}

上一篇
下一篇