我正在使用JAudiotagger库构建一个 mp3 标记应用程序。我的应用程序可以很好地读取 mp3 元数据,并且也可以很好地写入元数据,除了艺术品。所以我的问题如下:
当我在 mp3 文件中添加一些艺术作品并保存时,文件变得越来越大,这是有道理的。但是当我删除一件或所有艺术品时,文件大小并没有变小。
实际问题在于我的 mp3 文件的 ID3v2 标签。当我移除艺术品时,它实际上已从标签中移除,但标签大小本身并没有缩小。
我在删除艺术品时使用的方法是这样的:
// Get the artworkList from the parentFrame.
List<Artwork> list = parentFrame.getArtworkList();
// Get the tag from the parentFrame's mp3File.
AbstractID3v2Tag tag = parentFrame.getTag();
// Get the index of the artwork the user is currently looking at (and
// wants to delete too).
int visibleArtworkIndex = parentFrame.getVisibleArtworkIndex();
// Remove it from the list.
list.remove(visibleArtworkIndex);
// Update the parentFrame's copy of the artworkList.
parentFrame.setArtworkList(list);
// Update the tag (delete its whole artwork field).
tag.deleteArtworkField();
// If the list has more artworks left, add them to the tag.
if (!list.isEmpty()) {
Iterator<Artwork> iterator = list.iterator();
while (iterator.hasNext()) {
try {
tag.addField(iterator.next());
} catch (FieldDataInvalidException e1) {
e1.printStackTrace();
}
}
}
,它实际上从列表中删除了一件艺术品,然后通过删除其所有艺术品并从更新的列表中重新复制它们来更新标签本身。
我对解决方案的尝试是:
从更新的旧标签创建一个新标签(在调用之后
tag.deleteArtworkField()
),然后将艺术品添加到新标签,但新标签的大小与旧标签相同。在保存之前使用 修剪 mp3 文件
tag.adjustPadding(File fileToBeTrimmed, int sizeToStoreTagBeforeAudioInBytes, long audioStartByte)
,这会调整 MP3 文件开头的填充长度。
这里的问题是我只知道错误的标签大小而不是正确的,所以我无法正确修剪 mp3 并最终丢失音频数据。
为了更好地说明问题,我添加了一些图片:
之前的mp3文件:
移除一幅作品后的 mp3 文件。请注意,尽管艺术品较少,但标签仍保持其先前的大小:
以及文件应该如何:
我希望任何人有任何想法。提前致谢。