Erlang 如何在Elixir中读取和写入id3v1和id3v2标记

Erlang 如何在Elixir中读取和写入id3v1和id3v2标记,erlang,mp4,elixir,id3,Erlang,Mp4,Elixir,Id3,我想用Elixir扫描音乐文件和读/写元数据(整个项目是关于学习Elixir的——所以请不要告诉我使用Python!)。据我所知,我有两种选择:调用系统实用程序或(因为我知道Erlang或Elixir中不存在库)编写Elixir库。对于m4a文件,我对MP4Box进行系统调用,它将一个xml文件写入磁盘。然后我读入文件,解析它,并将数据加载到数据库中 def parse(file_name) do System.cmd("MP4Box", ["-diso",file_name]) Ain

我想用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工具,它只找到了id3v1标签。eyeD3仅找到id3v2标记。我的mp3都有,所以我需要确保它们是相同的(我想我可以删除id3v1标签,但我一直认为传统设备上需要id3v1标签)

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

还是我需要编写一个库来获得合理的性能?如果是这样的话,我是否可以尝试移植现有的函数式语言库


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

您可以始终使用erlang NIFs()包装外部库

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


检查文档以开始。

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

使用:

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

我已经在Elixir中实现了ID3v2标记读取(而不是写入)。它是开着的


支持是很基本的,;我实现了支持我的用例的最低要求。有很多bug,但是所有的构建块都是用来分叉/改进/贡献的。

,你可能会帮助这些链接:是的,这些链接很棒,因为它们展示了Elixir位语法的强大功能。不需要外部图书馆。是的,你是对的。我使用上面的链接作为模型来读取id3v1标记,这非常简单。我不敢攻击id3v2或mp4标记,因为它们更复杂。我认为Elixir是一种很好的使用方法,并且可以很好地实现这一点,但我对这些格式的了解有限(我担心不断扩展的副项目)。我想我会先看看下面Paweł提到的长生不老药NIF/端口。知道在哪里可以找到更多信息吗?谢谢。我刚刚编写了一个用于读取id3v1标记的模块,但是比较起来很好。现在我看的是id3v2——要复杂得多。