Я хочу добавить название альбома в файлы mp3. Я использую библиотеку Jaudiotagger для чтения и записи метаданных mp3. В моем mp3-файле нет метаданных мультимедиа, кроме длины. Я приложил скриншот свойств файла Windows 1 такого mp3-файла.
Учитывая каталог, код просматривает все mp3-файлы внутри него и присваивает имя альбома каждому mp3-файлу. Код выполняется без ошибок, но когда я пытаюсь открыть свойства этого mp3-файла. Тем не менее, у него нет никакой информации об альбоме. Пожалуйста, помогите мне узнать, что мне не хватает.
Ниже мой код
public class Test {
public static String albumName = null;
public static String toCamelCase(final String strInput) {
if (strInput==null)
return null;
final String init = strInput.replaceAll("-", " ").replaceAll("_", " ");
final StringBuilder ret = new StringBuilder(init.length());
for (final String word : init.split(" ")) {
if (!word.isEmpty()) {
ret.append(word.substring(0, 1).toUpperCase());
ret.append(word.substring(1).toLowerCase());
}
if (!(ret.length()==init.length()))
ret.append(" ");
}
return ret.toString();
}
private String getFileExtension(String fileName) {
String extension = "";
int i = fileName.lastIndexOf('.');
int p = Math.max(fileName.lastIndexOf('/'), fileName.lastIndexOf('\\'));
if (i > p) {
extension = fileName.substring(i+1);
}
return extension;
}
private void traverse(File dir) throws CannotReadException, TagException, ReadOnlyFileException, InvalidAudioFrameException, CannotWriteException {
try {
File[] files = dir.listFiles();
for (File file : files) {
boolean fileAlbumChecked = false;
if (file.isDirectory()) {
if (Test.albumName == null)
Test.albumName = toCamelCase(file.getName());
System.out.println("directory:" + toCamelCase(file.getName()));
file.renameTo(new File(file.getCanonicalPath()+"/"+toCamelCase(file.getName())));
traverse(file);
} else {
if (getFileExtension(file.getName()).equals("mp3")) {
MP3File mp3File = (MP3File)AudioFileIO.read(file);
//MP3AudioHeader audioHeader = (MP3AudioHeader) mp3File.getAudioHeader();
boolean hasV1Tag = mp3File.hasID3v1Tag();
boolean hasV2Tag = mp3File.hasID3v2Tag();
System.out.println(hasV1Tag+", "+hasV2Tag);
Tag tag = mp3File.getTag();
//ID3v1Tag v1Tag = (ID3v1Tag)tag;
AbstractID3v2Tag v2Tag = mp3File.getID3v2Tag();
ID3v24Tag v24Tag = mp3File.getID3v2TagAsv24();
String tempAlbumName = null;
AudioFile audioFile = AudioFileIO.read(file);
Tag tagwa = audioFile.getTag();
System.out.println("("+tagwa+")");
if (hasV1Tag) {
//Tag tag = mp3File.getTag();
//ID3v1Tag v1Tag = (ID3v1Tag)tag;
tempAlbumName = (tag.toString());
if (Test.albumName == null || Test.albumName.equalsIgnoreCase("unknown") || tempAlbumName != null) {
fileAlbumChecked = true;
Test.albumName = tempAlbumName;
tagwa.setField(FieldKey.ALBUM, Test.albumName);
audioFile.commit();
}
} else if (hasV2Tag) {
tempAlbumName = (v2Tag.getFirst(ID3v24Frames.FRAME_ID_ALBUM));
if (Test.albumName == null || Test.albumName.equalsIgnoreCase("unknown") || tempAlbumName != null) {
fileAlbumChecked = true;
Test.albumName = tempAlbumName;
tagwa.setField(FieldKey.ALBUM, Test.albumName);
audioFile.commit();
}
} else {
if (tagwa == null) {
tagwa = audioFile.createDefaultTag();
System.out.println("("+tagwa+")"+", Class: "+tagwa.getClass());
}
tagwa.addField(FieldKey.ALBUM, Test.albumName);
//tagwa.setField(FieldKey.ALBUM, Test.albumName);
audioFile.commit();
}
//AudioFileIO.write(audioFile);
}
System.out.println("file:" + file.getCanonicalPath()+", Album: "+Test.albumName);
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
String filePath = "C:\\music";
File dir = new File(filePath);
Test test = new Test();
try {
test.traverse(dir);
} catch (CannotReadException | TagException | ReadOnlyFileException | InvalidAudioFrameException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (CannotWriteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Вывод
directory:Ddlj
false, false
(null)
(Tag content:
), Class: class org.jaudiotagger.tag.id3.ID3v23Tag
file:C:\music\DDLJ\DDLJ-HO_GAYA_HAI_TUJKO_PYAR_SAJNA.mp3, Album: Ddlj
false, false
(null)
(Tag content:
), Class: class org.jaudiotagger.tag.id3.ID3v23Tag
file:C:\music\DDLJ\DDLJ-TUJHE_DEKHA_TO.mp3, Album: Ddlj
false, false
(null)
(Tag content:
), Class: class org.jaudiotagger.tag.id3.ID3v23Tag
file:C:\music\DDLJ\DDLJ-ZARA_SA_JHOOM_LOON_MAIN.mp3, Album: Ddlj
Отслеживание audioFile.commit()
при отладке audioFile.commit();
в строке номер 103 он выполняет следующий код
if (id3v2tag == null)
{
rfile = new RandomAccessFile(file, "rw");
(new ID3v24Tag()).delete(rfile);
(new ID3v23Tag()).delete(rfile);
(new ID3v22Tag()).delete(rfile);
logger.config("Deleting ID3v2 tag:"+file.getName());
rfile.close(); //<-- comes till here
}
...
rfile = new RandomAccessFile(file, "rw");
...
if (TagOptionSingleton.getInstance().isId3v1Save())
{
logger.config("Processing ID3v1");
if (id3v1tag == null)
{
logger.config("Deleting ID3v1");
(new ID3v1Tag()).delete(rfile); //<-- comes till here too
}
...
}
... //some catch statements
finally
{
if (rfile != null)
{
rfile.close(); //<-- comes till here too
}
}
и он выходит правильно без каких-либо ошибок.
Примечание: использование jaudiotagger-2.2.4
audioFile.createDefaultTag()
? Может быть, это не ID3-тег по какой-то причине, и вам нужно создать его самостоятельно? Попробуйте распечатать более подробную информацию о том, что происходит на важных этапах, чтобы вы могли увидеть, что может пойти не так. А еще лучше пройдитесь по нему с помощью отладчика. - person tyrel   schedule 04.04.2016audioFile.createDefaulTag()
возвращаетTag content:
. Я также обновил свой код некоторыми выводами системы и включил результат. Пожалуйста, посмотрите. Дайте мне знать, если вам нужно больше. - person   schedule 04.04.2016Tag
- это просто интерфейс, поэтому мне интересно, является ли реализация, выбранная по умолчанию, правильной. - person tyrel   schedule 04.04.2016org.jaudiotagger.tag.id3.ID3v23Tag
. Обновил мой код. - person   schedule 04.04.2016commit
, чтобы посмотреть, что он делает? Возможно, в библиотеке ошибка. - person tyrel   schedule 04.04.2016commit()
, все получилось правильно. Обновите мой вопрос с отладкойcommit()
внутриorg.jaudiotagger.audio.mp3.MP3File.class
- person   schedule 04.04.2016ID3v23Tag
, тогда почему кодcommit
находитid3v2tag == null
и удаляет его? Разве это не должно быть добавлено? - person tyrel   schedule 04.04.2016