【问题标题】:How to read and write id3v1 and id3v2 tags in Elixir如何在 Elixir 中读写 id3v1 和 id3v2 标签
【发布时间】:2015-08-05 17:11:13
【问题描述】:

我想使用 Elixir 扫描音乐文件和读/写元数据(整个项目都是关于学习 Elixir - 所以请不要告诉我使用 Python!)。据我了解,我有两种选择:调用系统实用程序或(因为我知道 Erlang 或 Elixir 中不存在任何库)编写一个 Elixir 库。对于 m4a 文件,我对 MP4Box 进行系统调用,并将 xml 文件写入磁盘。然后我读入文件,解析它,并将数据加载到数据库中。

def parse(file_name) do
  System.cmd("MP4Box", ["-diso",file_name])
  Ainur.XmlParser.parse(xml_file_name(file_name))
  |> get_tags
end

非常慢,尤其是对于数千个文件。我希望它在每次启动时运行以检查更改/新文件。

现在我正在尝试对带有 id3 标签的 mp3 做同样的事情。我在 Ubuntu 上尝试了 libid3-tools,它只找到了 id3v1 标签。 eyeD3 只找到 id3v2 标签。我的 mp3 两者都有,所以我需要确保它们是相同的(我想我可以删除 id3v1 标签,但我一直认为旧设备需要 id3v1 标签)。

是否有任何用于音乐元数据的 Erlang 或 Elixir 库?如果不是,对 ubuntu 实用程序的系统调用是我的最佳选择吗(关于哪些建议)?

或者我需要编写一个库来获得合理的性能吗?如果是这样,是否有我可以尝试移植的功能语言的现有库?

或者是否可以直接从 Elixir 调用用另一种语言编写的库(无需系统调用)?

【问题讨论】:

  • 是的,这些链接很棒,因为它们展示了 Elixir 位语法的强大功能。无需外部库。
  • 是的,你是对的。我使用上面的链接作为模型来读取 id3v1 标签,它非常简单。我对攻击 id3v2 或 mp4 标签犹豫不决,因为它们更复杂。我认为 Elixir 使用起来很有趣,并且可以很好地工作,但我对这些格式的了解有限(我担心不断扩展的副项目)。我想我会先看看下面 Paweł 提到的 Elixir NIF/Ports。知道在哪里可以找到更多信息吗?

标签: erlang mp4 elixir id3


【解决方案1】:

您也可以尝试直接读取文件的二进制文件以找到有问题的标签。

查看File.stream/3 文档以开始使用。

【讨论】:

    【解决方案2】:

    我已经在 Elixir 中实现了 ID3v2 标签读取(而不是写入)。它在GitHubHex 上。

    支持是非常基本的;我实现了最低限度来支持我的用例。有很多错误,但所有的构建块都可以派生/改进/贡献。

    【讨论】:

      【解决方案3】:

      在这个项目中,我们有一个用 Elixir 编写的模块,可以从 mp3 中提取 ID3 标签:

      https://github.com/anisiomarxjr/shoutcast_server/blob/master/lib/mp3_file.ex

      使用方法:

      id3 = Mp3File.extract_id3("./test/fixtures/nederland.mp3")
      

      【讨论】:

      • 谢谢。我刚刚写了一个用于读取 id3v1 标签的模块,但是很好比较。现在我在看 id3v2 - 要复杂得多。
      【解决方案4】:

      您始终可以使用 erlang NIF (http://erlang.org/doc/tutorial/nif.html) 来包装外部库

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-04-30
        • 2013-10-12
        • 1970-01-01
        • 2023-03-27
        • 1970-01-01
        • 1970-01-01
        • 2020-11-08
        • 1970-01-01
        相关资源
        最近更新 更多