抽象id3标签、m4a标签、flac标签之间的转换

Posted

技术标签:

【中文标题】抽象id3标签、m4a标签、flac标签之间的转换【英文标题】:abstracting the conversion between id3 tags, m4a tags, flac tags 【发布时间】:2010-10-16 09:57:45 【问题描述】:

我正在寻找一种在 python 或 bash 中易于获取的资源,例如,mp3 文件 X 和 m4a 文件 Y 并说“将 X 的标签复制到 Y”。

Python 的“诱变剂”模块通常非常适合处理标签,但没有跨越不同类型标签的“艺术家领域”的抽象概念;我想要一个处理所有繁琐位并知道字段名等价的库。对于并非所有标签系统都可以表达的事情,我可以接受信息丢失或最佳猜测。

(用例:我将无损文件编码为 mp3,然后使用 mp3 进行收听。每个月左右,我希望能够使用我对mp3s。我已经厌倦了对格式之间的实现差异保持警惕。)

【问题讨论】:

你总是可以使用已经很容易做这些事情的播放器,比如 foobar2000。无论格式如何,它的“复制标签”功能都可以做到这一点。 【参考方案1】:

您可以编写一个简单的应用程序,将每种格式的每个标签名称映射到“抽象标签”类型,然后很容易从一种转换到另一种。您甚至不必知道所有可用类型 - 只需了解您感兴趣的类型即可。

在我看来,这是一种周末项目类型的时间投资,可能更少。玩得开心,我不介意看看你的实现,甚至使用它——如果你当然不介意发布它:-)。

【讨论】:

【参考方案2】:

我需要这个确切的东西,我也很快意识到诱变剂不是一个足够遥远的抽象来做这种事情。幸运的是,mutagen 的作者在他们的媒体播放器QuodLibet 中需要它。

我不得不深入研究 QuodLibet 的源代码以了解如何使用它,但是一旦我理解了它,我就编写了一个名为 sequitur 的实用程序,它旨在成为一个相当于 的命令行>ExFalso(QuodLibet 的标记组件)。它使用这种抽象机制并提供一些附加的抽象和功能。

如果您想查看源代码,here's a link to the latest tarball。该包实际上是一组三个命令行脚本和一个用于与 QL 交互的模块。如果你想安装整个东西,你可以使用:

easy_install QLCLI

关于 exfalso/quodlibet(以及随之而来的 sequitur)要记住的一件事是,它们实际上正确地实现了音频元数据,这意味着所有标签都支持多个值(除非文件类型禁止它,这并不多做)。所以,做这样的事情:

print qllib.AudioFile('foo.mp3')['artist']

不会输出单个字符串,但会输出一个字符串列表,例如:

[u'The First Artist', u'The Second Artist']

您可以使用它来复制标签的方式类似于:

import os.path
import qllib  # this is the module that comes with QLCLI

def update_tags(mp3_fn, flac_fn):
    mp3 = qllib.AudioFile(mp3_fn)
    flac = qllib.AudioFile(flac_fn)
    # you can iterate over the tag names
    # they will be the same for all file types
    for tag_name in mp3:
        flac[tag_name] = mp3[tag_name]
    flac.write()

mp3_filenames = ['foo.mp3', 'bar.mp3', 'baz.mp3']

for mp3_fn in mp3_filenames:
    flac_fn = os.path.splitext(mp3_fn)[0] + '.flac'
    if os.path.getmtime(mp3_fn) != os.path.getmtime(flac_fn):
        update_tags(mp3_fn, flac_fn)

【讨论】:

Jeremy Cantrell 的 quod-cli 库现已在 Github 上提供:github.com/jmcantrell/quodlibet-cli【参考方案3】:

还有tagpy,好像效果不错。

【讨论】:

【参考方案4】:

这是一些示例代码,我编写的用于在 使用 Quod Libet 的音乐格式类(不是诱变剂的!)的文件。跑步 它,只要做copytags.py src1 dest1 src2 dest2 src3 dest3,它 将 sec1 中的标签复制到 dest1 (删除任何现有标签后 在 dest1 上!),依此类推。注意黑名单,你应该调整到 你自己的喜好。黑名单不仅会阻止某些标签 不被复制,它也将防止它们被破坏 目标文件。

需要明确的是,Quod Libet 与格式无关的标记不是诱变剂的功能;它是在诱变剂之上实现的。因此,如果您想要与格式无关的标记,则需要使用 quodlibet.formats.MusicFile 而不是 mutagen.File 打开文件。

现在可以在这里找到代码:https://github.com/DarwinAwardWinner/copytags

如果您还想同时进行转码,请使用:https://github.com/DarwinAwardWinner/transfercoder

对我来说一个重要的细节是 Quod Libet 的音乐格式课程 期望 QL 的配置被加载,因此我的 config.init 行 脚本。没有它,我在加载或保存时会遇到各种错误 文件。

我已经测试了这个脚本在flac、ogg 和mp3 之间复制,带有“标准”标签,以及任意标签。到目前为止,它运行良好。

至于我没有使用 QLLib 的原因,它对我不起作用。我怀疑它遇到了和我一样的配置相关错误,但是默默地忽略了它们,只是没有写标签。

【讨论】:

而且,正如墨菲定律所预测的那样,QLLib 在我写完这个脚本后就开始完美地为我工作。 在我尝试过的众多解决方案中,这对我有用。谢谢!【参考方案5】:

我有一个 bash 脚本可以做到这一点,atwat-tagger。它支持flac、mp3、ogg和mp4文件。

usage: `atwat-tagger.sh inputfile.mp3 outputfile.ogg`

我知道您的项目已经完成,但是通过搜索引擎找到此页面的人可能会觉得它很有用。

【讨论】:

以上是关于抽象id3标签、m4a标签、flac标签之间的转换的主要内容,如果未能解决你的问题,请参考以下文章

在 Python 3 中读取 ID3 标签

音乐标签Android版

寻找用于编辑 AAC 元数据(M4A 文件)的开源库 [关闭]

ViWizard Music Converter for Mac如何将音乐转换为 MP3?

如何停止将已知类型转换为 id3v2 标签中的数字?

python调用ffmpeg批量转换音频flac、mp3、m4a