NAudio 和阅读 Wave Format 可扩展文件

问题描述

我想在 NAudio 中读取 Wave Format Extensible 文件,因此我想出了以下方法

static void Main(string[] args)
{
    const string filename = "output_24m.wav";

    var bytes = File.ReadAllBytes(filename);

    var stream = new MemoryStream(bytes);

    using(var reader = new WaveFileReader(stream))
    {
        Console.WriteLine($"Bits: {reader.WaveFormat.BitsPerSample}");
        Console.WriteLine($"Size: {reader.Length}");
        Console.WriteLine($"Channels: {reader.WaveFormat.Channels}");
        Console.WriteLine($"Format: {reader.WaveFormat.Encoding}");

        if (reader.WaveFormat.Encoding == WaveFormatEncoding.Extensible)
        {
            var extra = reader.WaveFormat as WaveFormatExTradata;
            var extensible = reader.WaveFormat as WaveFormatExtensible;

            GCHandle handle = GCHandle.Alloc(extra.ExTradata,GCHandleType.Pinned);
            WaveFormatExtensibleStruct extensibleStuff = Marshal.PtrToStructure<WaveFormatExtensibleStruct>(handle.AddrOfPinnedobject());
            var isPcm = extensibleStuff.subFormat.Equals(new Guid("00000001-0000-0010-8000-00AA00389B71"));
            handle.Free();
        }
    }
}

[StructLayout(LayoutKind.Sequential,CharSet = CharSet.Ansi,Pack = 2)]
struct WaveFormatExtensibleStruct
{
    public short validBitsPerSample;
    public int channelMask;
    public Guid subFormat;
}

这有效,但看起来非常混乱。 'extra' 变量已定义,但 'extensible' 变量为空,因为波形格式数据不是 WaveFormatExtensible 类型,而是 WaveFormatExTradata 类型。

为了获得子格式,我创建了 WaveFormatExtensibleStruct 结构来读取额外的数据。我必须提供 GUID,因为虽然 guid MEdisUBTYPE_PCM 本身是公开的,但类 AudioMediaSubtypes(在 NAudio 中)not

我正在寻找的是确认音频的类型是 PCM,并且有问题的文件是(isPcm 是真的),但这似乎是使用 NAudio 实现这一点的混乱方式。那么我如何使用 NAudio 做到这一点呢?它告诉我的格式是“可扩展的”,但我需要确保它是 PCM。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)