0

我正在尝试读取存储在由噪声监控设备生成的 WAV 文件上的 ICMT 标签中的数据。

RIFF 解析代码似乎工作正常,除了 ICMT 标签似乎在声明的大小之后有数据。幸运的是,它是时间戳,对于我的应用程序来说,这是一条绝对重要的信息。

SYN是十六进制 16,其大小为 22,最多包含时间戳之前的 NUL。监视器文档没有帮助;它说标签包括时间,但他们的例子也有同样的问题。

在此处输入图像描述

它是封闭列表中的最后一个标签,并且列表的大小确实包含它 - 这是否意味着它不需要块 ID?我正在努力寻找像样的 RIFF 文档,但我找不到任何表明这种情况的东西;我也看不出如何确定它是最后一个块,因此知道在没有块 ID 的情况下读取它。

或者,ICMT 注释块是文件中的最后一件事——这是特例吗?我可以通过阅读从声明长度 ICMT 末尾到文件末尾的所有内容来获取时间,并假设这将始终有效吗?

当前的解析器行为是在通道/dB信息作为块ID +大小之后读取它,然后抱怨文件中没有足够的数据来满足请求。

4

1 回答 1

1

不,它仍然需要自己的 ID。不,作为文件中的最后一件事也不是特殊情况。您在此处显示的内容格式不正确。

您当前的解析器错误正确,因为接下来要再次预期的是一个 4 字节的 ID,后跟 4 个字节的长度。潜在的 ID_10:是未知的并且会被跳过,但是51:4在长度上解释为 DWORD 当然会很麻烦。

设备是罪魁祸首。您是否还有其他使用 NULL 字节的 INFO 字段?如果不是,那么我认为该设备足够天真,可以将 NULL 视为字符串的结尾,尽管他自己生成了具有多个 NULL 的字符串。

由于我遇到了无数不符合标准的文件,我只能说您的解析器也太天真了:它知道封装列表有多长,因此可以轻松检测不再适合的字段长度。并且可以忽略这样的垃圾。或者,在您的情况下,提供非常具体的选项“添加到最后一个字段”。

于 2018-06-06T15:43:39.270 回答