2016-04-01 4 views
0

Я хочу добавить название альбома в mp3-файлы. Я использую библиотеку Jaudiotagger для чтения и записи метаданных mp3. В моем mp3-файле нет мультимедийных метаданных, кроме длины. Я приложил скриншот свойств файлов Windows из 1 такого mp3-файла. enter image description hereМетаданные 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

+0

Интересно, какой тип тега возвращается 'audioFile.createDefaultTag()'? Возможно, по какой-то причине это не тег ID3, и вам нужно создать его самостоятельно? Попробуйте распечатать более подробную информацию о том, что происходит на важных этапах, чтобы вы могли видеть, что может быть неприятным. Еще лучше, пройдите через него с помощью отладчика. – tyrel

+0

@tyrel: Спасибо, что посмотрели на эту проблему. 'audioFile.createDefaulTag()' возвращает 'Содержимое тега:'. Я также обновил свой код с некоторыми выходами системы и включил результат. Пожалуйста, смотрите. Дайте мне знать, если вам нужно больше. – Ricky

+0

Можете ли вы также распечатать (или посмотреть, как сделать шаг в отладчике), какой класс возвращает тег? 'Tag '- это просто интерфейс, поэтому мне интересно, правильная ли реализация, выбранная по умолчанию. – tyrel

ответ

0

Следующего кода считывает существующий АЛЬБОМ тег из файла в формате MP3, а затем переписывает его с новым альбомом тегом.

MP3File audioFile = (MP3File) AudioFileIO.read(new File("test.mp3")); 
Tag tag = audioFile.getTag(); 
if (tag == null) { 
    tag = new ID3v22Tag(); 
} 
List<TagField> albumFields = tag.getFields(FieldKey.ALBUM); 
System.out.println("Existing ALBUM fields: " + albumFields); 
tag.deleteField(FieldKey.ALBUM); 
tag.addField(FieldKey.ALBUM, "test album 2"); 
audioFile.setTag(tag); 
audioFile.save(); 

Он был протестирован для работы с java 1.7 и jaudiotagger 2.2.3 на Linux.

Смежные вопросы