java如何插入长度超过30个字符的ID3标记?
我意识到使用像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),但我也不确定如何通过编程实现
# 1 楼答案
我知道这是一个老生常谈的问题,你现在可能已经解决了问题,但我想我会更详细地回答任何遇到类似问题的人
ID3v1(有时可能被称为“ID3”)是位于文件末尾的一个短的结构化数据块。ID3v2标签——在所有版本中——都由许多可选的“字段”组成,这些字段通常可以是任意(合理)长度、任意顺序,并且位于文件的开头。据我所知,它们名称相似的唯一原因是它们被添加到同一类型的文件中。任何为解析/更新一个版本而编写的东西都不知道如何处理另一个版本
正如最初的问题所表明的,ID3v1特别容易阅读;任何完整实现的最大部分都是体裁查找表。ID3v2(无论是修订版2.3还是2.4)与其更大的权力相适应,显然是而不是。实际上,我建议将其作为理解元数据或学习实现规范的中级练习,但对于任何只想使用数据的程序,最好只参考其中一个预先构建的库。不幸的是,我对Java实现的了解还不足以推荐一个,但是环顾四周,你会发现很多关于它们的讨论
# 2 楼答案
在ID3v2诞生之前,有一个非官方的“增强标记”/“ID3扩展”/“标记+”,可以在几乎所有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