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