微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

NAudio 和阅读 Wave Format 可扩展文件

如何解决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 举报,一经查实,本站将立刻删除。