从 mp3 id3v2 标签中识别歌曲信息

Posted

技术标签:

【中文标题】从 mp3 id3v2 标签中识别歌曲信息【英文标题】:identify song information from mp3 id3v2 tags 【发布时间】:2011-06-16 18:00:26 【问题描述】:

我已经有 mp3 二进制数据,我只想知道如何从中提取信息。 v1 很简单,取最后 128 个字符即可。但 v2 的长度可变。文档说标签大小将在标题中,但我无法在我测试的任何歌曲中找到它。

但无论如何我只是想提取专辑和艺术家信息.. jsut 这两个,用 javascript。为简单起见,我在变量中有 Taylor swift 歌曲的前 2000 个字节(下面是歌曲的实际二进制数据):

ID3!vTYER2010TIT2
Last KissMCDI¬E+96+4484+918B+E800+12F4B+1A636+1EC24+23A8E+2905F+2F7DD+33868+3914B+3D931+44555+4A27BTRCK13TCON(2)CountryPRIVPeakValue¡PRIVAverageLevel TPE2
Taylor SwiftPRIV)WM/MediaClassSecondaryIDPRIV'WM/MediaClassPrimaryID¼`Ñ#ãâK¡H¤*(DPRIVWM/ProviderAMGPRIVWM/WMContentIDÇ1t>êDëþëPRIV"WM/WMCollectionID   ¨FâH"Y#7 ÈPRIV'WM/WMCollectionGroupID  ¨FâH"Y#7 ÈTPUBBig MachinePRIVWM/UniqueFileIdentifierAMGa_id=R  2026672;AMGp_id=P   816977;AMGt_id=T 22057912TALB
Speak NowTPE1
Taylor SwiftTLEN369120ÿûà@üK

现在我可以轻松找到专辑和艺术家姓名(最后两行)。而且我还可以很容易地找到数据以 js 开头的位置。只需找到TALBTPE1。简单的。但是我到底怎么知道数据在哪里结束..?在其他歌曲中,它们可能彼此相邻,也可能不相邻。它们可能是也可能不是大写。所有其他库如何确定数据的结束位置?

如文档所示,开头也没有“大小”。

编辑谁能帮帮我?我真的很需要这个

【问题讨论】:

似乎 ID3 标头丢失了一部分。你有机会分享文件,我们可以看看吗? @TankorSmash from file 您是指音频文件还是提取 id3 标头的代码?正如 J. Andrew Laughlin 的回答所说,所有字符都是不可打印的,所以也许这就是数据不完整的原因? 我的意思是音频文件,我目前使用 Python,我可以看看它,看看是否确实缺少数据,或者它只是无法打印。除非你处理好了,否则你就准备好了? 是的,我实际上放弃了解析id3v2的想法,我只使用id3v1。 哦,真可惜,我正准备尝试帮助你,因为我正在尝试做同样的事情 【参考方案1】:

您显示的二进制示例缺少一些数据。一个ID3 2.4版本的标签帧头长度为10字节,由以下字段组成:

ID -- 4 个字节(例如 TIT2)

大小 -- 4 字节(在 >= 2.4 版本中是同步安全的)

标志 -- 2 个字节

大小字段告诉您该特定帧中有多少字节的数据。同样,实际的标签头也是 10 个字节:

ID -- 3 个字节(总是 ID3)

版本 -- 2 字节(主要版本和修订版。例如 0x04 0x00 表示 2.4.0 标签版本)

标志 -- 1 字节

大小 -- 4 字节(在 >= 2.3 版本中是同步安全的)

见:http://id3.org/id3v2.4.0-structure

一旦您的脚本拥有二进制数据,您就可以解析这些大小字段以确定完整标签的大小以及每个帧的大小。一旦达到这一点,您将遇到同步安全整数。

见:Why are there Synchsafe Integer?

【讨论】:

是的!我也是这么想的,但那是实际的输出。我从输出屏幕本身粘贴了它。令我惊讶的是,我尝试了各种专辑中的一堆歌曲,但没有一首有 10 字节的标题。也许这是规范规定的,但歌曲通常不遵循? 据我所知,从您的回答和文档中,每个标签框架(例如艺术家姓名、专辑名称等)都是预定义的标识符,在标题中说明......对?像这样是标题other header info [some 'predefined identifier'] other header info 和标签正文[that 'predefined identifier'] frame info 我正确吗? 是的。每个帧都属于特定类型。例如,ID 为 TPE1 的帧通常代表艺术家。有很多帧类型。请参阅:id3.org/id3v2.4.0-frames。如果您使用的是 Linux 或 OS X,Bulk ID3 将准确显示您的标签包含的内容。见:sourceforge.net/projects/bulkid3。请记住,它目前是 Alpha 版。此外,复制和粘贴不一定会提供所有数据,因为许多值是不可打印的。您需要一个好的十六进制编辑器来查看实际数据。 感谢参考链接。你能指点我一个好的 javascript 十六进制编辑器吗?我目前正在使用 FileSystem API 的 readAsBinaryString 来获取二进制数据.. chrome 的开发面板显示的正是上面显示的内容。另外,如果这是一个不可打印的字符问题,那么至少必须有一些字符(例如标题长度,它是一个数字,因此是可打印的) 有很多不错的十六进制编辑器可用。您选择的将取决于您使用的操作系统。我用祝福。【参考方案2】:

试试this library,看起来它可以满足您的需求。

【讨论】:

这里的人就是喜欢图书馆……对吧? :P 但我离做整个库只用(字面意思)两行代码所做的事情只有一步之遥。 :) 加上该库只读取 v1 标签并引用作者 Maybe I'll try to add support for the v2 tags later.

以上是关于从 mp3 id3v2 标签中识别歌曲信息的主要内容,如果未能解决你的问题,请参考以下文章

使用 JavaFX MediaPlayer 从 MP3 读取 ID3v2 标签

使用 id3v2 获取 MP3 ID3 (V2) 标签

请教mp3ID3V2编码问题:选择utf-16和 iso-8859-1有啥区别?哪个更常用更好?

在 MP3 ID3v2 标签中设置歌词

如何用 java 读/写 ID3v2 标签?

音频流中的歌曲标题编码