批量修改MP3文件信息

前两天本人在整理自己的歌单时(题外话,本人是一个热衷音乐的程序员噢,哈哈),发现之前下载的很多MP3文件里的歌手,标题等信息对不上,很多都是错的。对于患有“强迫症”的本人来说,当然不会允许这种情况出现啊,哈哈。在查阅了一些资料,并且咬着牙关看了那些“经书”,花了两天终于解决。这里给大家分享一些经验和填补网上资料的一些坑,有兴趣的同僚可以参考参考。这里说一下本人在查阅资料的时候一些感受,我在查阅资料的有几篇文章都不错,但是有几个细节不一样,这样对于不熟悉这块知识的我,我根本不知道谁对谁错,所以最好的方式就是实践操作,毕竟实践是检验真理的唯一标准,嘿嘿。所以,在这里我想对各位同僚和我自己都劝告一下:如果对技术知识而言,我们只想了解,那么去网上看几篇好的文章足以,某些细节并不重要;但是如果学会的话,必须去亲手实践。因为,我们很可能学到知识都是错的(当然毕竟是少数)。好了,话不多,开始正题讲解。

首先,如何知道MP3文件里的歌手,标题信息等对不上呢?

这里提供两种常用方式查看,一种是通过操作系统查看;一种是各种音乐播放器查看。其实还有各种操作音频的工具软件,这里不提供,有兴趣的去网上搜一搜。

Windows操作系统截图:
《批量修改MP3文件信息》

酷我音乐播放器截图:
《批量修改MP3文件信息》

我这里说明一下,我最开始以为MP3文件名,就是MP3标题名(歌名)。本人觉得这个是误区。所以,从上面两张图片可以看出,MP3文件名和标题名是两回事,从这里也可以得知,MP3文件的标题,歌手以及其他信息都是写在文件里的。所以要想修改MP3文件的标题,歌手等信息,就得修改MP3文件。

其次,如何修改MP3文件信息?

知道如何查看MP3信息后(后面调试程序,如何得知修改正确与否,用上述方法查看即可),下面就是修改MP3文件信息了。其实就两步,一步解析文件,二步写入文件。

解析文件:

这里我简单说明一下MP3文件信息,MP3文件主要有两大版本。分别是ID3V1、ID3V2版本。ID3V1版本比较简单一点,都是一些比较老的MP3文件才是ID3V1版本。MP3文件歌手、标题等信息都写在文件最后的128字节中。

详见下图:
《批量修改MP3文件信息》

所以,知道MP3信息之后,就很容易修改了。以二进制形式读取文件,将文件数据都读取一个字节数组中。然后在对应的未知进行修改,超出部分补0即可。文章后面会给出能运行的完整源码实现(C/C++版本)。

ID3V2版本,就相比ID3V1版本麻烦一些,但也不是很难。网上说改版本又划分为1|2|3|4号字版本,3号子版本最常用。但本人解析的所有的ID3V2版本的MP3文件中,都是3号子版本,也许是本人的样本数量太小,这里不做深究。下面给出一张图进行说明:
《批量修改MP3文件信息》

标签头组成,见下图:
《批量修改MP3文件信息》

上面标红的值需要关心,其它字段对于修改MP3信息而言,并不重要。这里需要说明一下长度字段,我看了几篇文章,有两种答案(一种是包括标签头大小,一种是不包括标签头大小)。但是我分别使用这两种方案计算,并不影响结果,所以本人也就没继续深究了,感兴趣的同僚可以研究一下,如果可以顺便告诉一下本人,嘿嘿。

标签帧组成,见下图:
《批量修改MP3文件信息》

上面标红的值需要关心,其它字段对于修改MP3信息而言,并不重要。这里我说明一下信息类型字段混合帧内容字段。信息类型是有个表的,这里不给出所有,只给出我这个程序用到的。

TIT2 —- 歌名、标题
TPE1 —- 歌手、创作者
TALB —- 专辑、唱片

帧内容字段,这里需要特别说明,各种乱因为网上很多文章都不对帧内容进行说明,导致我在解析帧内容时各种乱码,也因此花了些时间。帧内容第一个字节是内容编码格式,有三种。当值为0时,为GBK;当值为1时,为UNICODE;当值为2时,为UTF-8。这里说明一下,当为UNICODE编码时,如果直接读取内容,最开始会有个问号字符,如果偏移2个字节在进行读取,就不会有问号(这里我也不知道为什么,在网上查没有查到,我解析的所有MP3文件都是得偏移2个字节)。

通过上诉说明,发现其实ID3V2也并不是那么复杂,所以修改MP3文件时,把原来的标签帧去掉,写入新的标签帧信息,然后修改标签头长度,最后保存至新的MP3文件即可。

当然,上诉说的都是正常规范的MP3文件,其实还有很多不规范的MP3文件,比如果有的没有标题、歌手、专辑等信息;有的没有标签信息;有的标签帧的帧内容长度是错的等等(这个是ID3V2版本),在实际的过程中这些问题都可能会遇到。但是别慌,实践调试是最好的“老师”。所以我经过了上百次的调试,才大概完成了这个程序。本人收录的近700个MP3文件全部修改正确。下面是修改后的图:

大家可以看到,唱片集信息已经改成本人的公众号了(哈哈)。下面给出我用C++语言实现的版本源码地址,需要说明一下的是,测试的时候,将MP3文件改成【xxx】xxx.mp3命名格式,不然会出错。当然如果你会了,就很容易修改我的代码,祝早点成功。

链接:https://pan.baidu.com/s/1lKEe-C6YcjwIvFQtLS7GZA
提取码:l6an

    原文作者:程序员JackChen
    原文地址: https://blog.csdn.net/Jack_chen8888/article/details/105523889
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞