我意识到使用像mp3agic或jaudiotagger这样的库会更容易,但我想手动编辑id3标签用于学习目的。
我已设置代码以正确获取标签,但是我注意到对于某些歌曲,标题被剪切为30个字符但是当我在音乐播放器中打开.mp3文件时,显示的是完整标题,这比30个字符。
这是我现在用来查看代码的代码:
File mp3File = new File(filePath);
byte[] mp3Meta = new byte[128];
try {
//convert file into array of bytes
fileReader = new FileInputStream(mp3File);
fileReader.skip((int)mp3File.length() - 128);
fileReader.read(mp3Meta);
String id3 = new String(mp3Meta);
String tag = id3.substring(0, 3);
if (tag.equals("TAG")) {
System.out.println("\nTitle: " + id3.substring(3, 32) + "\n" +
"Artist: " + id3.substring(33, 62) + "\n" +
"Album: " + id3.substring(63, 91) + "\n" +
"Year: " + id3.substring(93, 97) + "\n" +
"************************************************");
} else {
System.out.println("File has no ID3 tags..");
}
}catch(Exception e){
e.printStackTrace();
}
我知道如何编辑标签,但如果长度超过30个字符,如何获得完整标题(或任何标签)?我读过有一种方法可以在id3v2中添加超过30个字符的标签,但我不知道如何访问id3v2帧
我相信我必须确定mp3正在使用哪个版本(id3v1或id3v2),但我不确定如何以编程方式执行此操作。
答案 0 :(得分:0)
我知道这是一个老问题,你现在可能已经知道了什么,但我想我会更详细地回答那些遇到任何类似问题的人。
ID3v1(有时可能只被称为" ID3")是位于文件末尾的简短结构化数据块。 ID3v2标签 - 在所有版本中 - 由许多可选的"字段组成"通常可以是任何(合理的)长度,以任何顺序,并且位于文件的开头。据我所知,他们有相似名称的唯一原因是因为他们被添加到同一类型的文件中。编写解析/更新一个版本的任何内容都不知道如何处理另一个版本。
正如最初的问题所示,ID3v1特别容易阅读;任何完整实现的最大部分将是类型查找表。 ID3v2(无论是修订版2.3还是2.4),因为它的强大功能,显然不是。我实际上建议将其作为中级练习来理解元数据或学习实现规范,但对于任何您只想使用数据的程序,它会更好只需参考一个预建的库。不幸的是,我对Java实现不太了解推荐一个,但是看一下,你会发现很多关于它们的讨论。
答案 1 :(得分:0)
在ID3v2诞生之前,有一个非官方的“ Enhanced TAG” /“ ID3 Extended” /“ TAG +”为几乎所有ID3v1字段增加了60个字节(无冗余)。参见https://web.archive.org/web/20120310015458/http://www.fortunecity.com/underworld/sonic/3/id3tag.html和https://phoxis.org/2010/05/08/what-are-id3-tags-all-about/#id3v1ext
另一种半官方标准是“ Lyrics3”版本2.00,它几乎可以为每个ID3v1字段存储250个字节(是冗余的)。参见http://id3.org/Lyrics3v2