【问题标题】:Reading tag data for Ogg/Flac files读取 Ogg/Flac 文件的标签数据
【发布时间】:2010-12-24 12:13:24
【问题描述】:

我正在开发一个从音乐文件中读取标签信息的 C 库。我已经处理了 ID3v2,但我无法弄清楚 Ogg 文件的结构。

我在 hexeditor 中打开了一个 .ogg 文件,我可以找到标签数据,因为这都是人类可读的。但是从文件开头到标签数据的所有内容看起来都像垃圾。这些数据是如何编码的?

我在实际代码中不需要任何帮助,我只需要帮助可视化 Ogg 标头的外观以及它使用的编码,以便我可以阅读它。我想使用一种非 hacky 的方法来读取 Ogg 文件。

我一直在查看Flac format,这很有帮助。

我正在查看的 Flac 文件在“fLac”标识符和人类可读的注释部分之间大约有 350 个字节,并且在我的十六进制编辑器中没有一个是人类可读的,所以我确定必须有 里面有重要的东西。

我使用的是 Linux,我无意移植到 Windows 或 OS X。所以如果我需要使用仅 glibc 的函数来转换编码,我可以接受。

【问题讨论】:

    标签: c metadata oggvorbis


    【解决方案1】:

    Ogg 文件格式记录在 here。根据您的要求,有一个非常漂亮的图形可视化,并附有详细的书面说明。

    您可能还想查看libogg,它是一个开源 BSD 许可库,用于读取和写入 Ogg 文件。

    【讨论】:

      【解决方案2】:

      如您提供的链接中所述,“fLaC”标记和 VORBIS_COMMENT 元数据块之间可能出现以下元数据块。

      • STREAMINFO:此块包含有关整个流的信息,例如采样率、通道数、采样总数等。它必须作为流中的第一个元数据块存在。其他元数据块可能会紧随其后,解码器不理解的会跳过。
      • 应用程序:此块供第三方应用程序使用。唯一的必填字段是 32 位标识符。此 ID 是根据 FLAC 维护者向应用程序的请求授予的。块的其余部分由注册的应用程序定义。如果您想通过 FLAC 为您的应用程序注册一个 ID,请访问注册页面。
      • PADDING:此块允许任意数量的填充。 PADDING 块的内容没有意义。当已知元数据将在编码后进行编辑时,此块很有用;用户可以指示编码器保留足够大小的 PADDING 块,以便在添加元数据时,它会简单地覆盖填充(相对较快),而不必将其插入现有文件中的正确位置(这将通常需要重写整个文件)。
      • SEEKTABLE:这是用于存储搜索点的可选块。可以在没有查找表的情况下查找 FLAC 流中的任何给定样本,但延迟可能无法预测,因为流中的比特率可能变化很大。通过向流中添加搜索点,可以显着减少这种延迟。每个查找点占用 18 个字节,因此流中 1% 的分辨率增加了不到 2k。一个流中只能有一个 SEEKTABLE,但该表可以有任意数量的查找点。还有一个特殊的“占位符”搜索点,将被解码器忽略,但可用于为将来的搜索点插入预留空间。

      在上面的描述之后,还有每个块的格式规范。该链接还说

      FLAC 比特流中使用的所有数字都是整数;没有浮点表示。所有数字都是大端编码的。除非另有说明,否则所有数字都是无符号的。

      那么,你错过了什么?你说

      我想要一种非 hacky 的方法来读取 Ogg 文件。

      既然库已经存在,为什么还要重写它们呢?

      【讨论】:

      • 我不明白这些块的顺序是什么。它说 STREAMINFO 必须是第一个,但之后不能保证它们的顺序,甚至可能不是那里。我不关心 STREAMINFO 或 APPLICATION 中的数据;我只想要 cmets 部分,但我不知道如何知道 cmets 在哪里。在找到 cmets 之前,我需要通读所有这些数据。是否有一些标识符表明 cmets 将跟随?有一个整数表示 cmets 占用了多少字节,但我不知道在哪里可以找到它。
      • 每个元数据块都有一个元数据头。该标头指定它是否是最后一个元数据块以及它是什么元数据类型。见flac.sourceforge.net/format.html#metadata_block
      • 哦,我明白了,它只是一个 int 标识符。我在想它会是一个像 ID3 使用的字符串。所以基本上我需要为 vorbis_comment 寻找 4 的 id。如果不是 4,我需要将该块通读到下一个块并再次检查。我会给你答案和 +1,但 Adisak 的答案对于描述页面布局也很有用,所以我可以通读它。希望我能标记 2 个答案。
      猜你喜欢
      • 2021-02-11
      • 1970-01-01
      • 1970-01-01
      • 2021-02-05
      • 2011-05-26
      • 2011-09-12
      • 2016-11-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多