作者:郑童宇
GitHub:https://github.com/CrazyZty
1.前言
做了三年左右的Android开发,一直没写过博客,最近正好打算换工作,算是闲一些,就将以前开发所遇到的一些有趣的问题及解决方法写出来,以供他人借鉴。
MP3作为音频领域应用最广的压缩方式之一想必大家都有所了解,本篇博文探究的不是MP3著名的压缩方式,而是如何为MP3文件写入ID3Tags。写下本博文的原因是类似的博文太少,以前做这方面的时候,google出来的大多是使用某一软件或库来进行处理,少许涉及代码的基本都是读取标签信息,或写入ID3v1标签,更糟糕的是网上大多数对ID3v2标签的读取是存在问题,以至于当我试图借鉴读取标签的博文来反向为MP3文件写入ID3v2标签时一直出现标签信息乱码的情况,直到google出一篇文章才得以解决。本篇博文以Java作为示例语言,以Android作为示例平台。
2.ID3标签
2.1.ID3v1标签
ID3v1是一个很方便写入和解析的标签,维基百科上对ID3v1的解释是"v1版的ID3在MP3文件的末尾128字节,以TAG三个字符开头,后面跟上歌曲信息"。通过http://bbs.pfan.cn/post-372622.html,我们可以获取128个字节的具体信息:
名称 字节 说明
Tag 3 ID3V1标识符“TAG”的Ascii码
Title 30 歌曲名
Artist 30 歌手名
Album 30 专辑名
Year 4 日期信息
Comment 28 注释信息,有时为30字节
Reserved 1 =0说明有音轨,下一字节就是音轨;≠0表示注释是30个字节
Track 1 音轨(字节型数值),歌曲在专辑里的序号
Genre 1 歌曲风格(字节型数值)
看到这个数据结构,想必大家已经很清楚如何写入ID3V1标签了,下面我就直接贴出代码,并对代码中部分模块进行解释。
<span style="font-family:Microsoft YaHei;font-size:14px;"> public static void StorageMusicFileWithID3V1Tag(File sourceFile, String musicFilePath,
String songName, String artistName,
String albumName) {
try {
sourceFile.renameTo(new File(musicFilePath));
RandomAccessFile musicRandomAccessFile = new RandomAccessFile(musicFilePath, "rw");
musicRandomAccessFile.seek(musicRandomAccessFile.length() - 128); // 跳到ID3V1开始的位置
byte[] tag = new byte[3];
musicRandomAccessFile.read(tag);
if (new String(tag).equals("TAG")) {
return;