2016-04-01 33 views
0

Ich möchte den MP3-Dateien den Namen des Albums hinzufügen. Ich benutze Jaudiotagger Bibliothek zum Lesen und Schreiben von MP3-Metadaten. In meiner mp3-Datei gibt es außer der Länge keine Medienmetadaten. Ich habe einen Screenshot der Windows-Dateieigenschaften von 1 solcher mp3-Datei beigefügt. MP3-Metadaten werden nicht aktualisiert

Bei einem Verzeichnis durchläuft der Code alle darin enthaltenen MP3-Dateien und weist jeder MP3-Datei den Namen des Albums zu. Der Code wird ohne Fehler ausgeführt, aber wenn ich versuche, die Eigenschaften dieser MP3-Datei zu öffnen. Noch hat es keine Albuminformationen. Bitte helfen Sie mir herauszufinden, was ich vermisse.

Unten ist mein Code

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(); 
     } 
    } 

} 

Ausgabe

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()

auf Debuggen audioFile.commit(); auf Zeilennummer 103 es Tracing gibt den folgenden Code

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 
    } 
} 

und es kommt richtig ohne Fehler aus.

Hinweis: jaudiotagger-2.2.4

+0

Ich frage mich, welche Art von Tag von 'audioFile.createDefaultTag()' zurückgegeben wird? Vielleicht ist es aus irgendeinem Grund kein ID3-Tag, und Sie müssen es selbst erstellen? Versuchen Sie, bei wichtigen Schritten mehr Details über die Vorgänge auszudrucken, damit Sie sehen können, was schief gehen könnte. Noch besser, mit einem Debugger durchgehen. – tyrel

+0

@tyrel: Vielen Dank, dass Sie sich mit diesem Problem beschäftigt haben. 'audioFile.createDefaulTag()' gibt 'Tag content:' zurück. Ich aktualisierte auch meinen Code mit einigen Systemausgaben und schloss das Ergebnis ein. Bitte guck dir das an. Lass es mich wissen, wenn du mehr brauchst. – Ricky

+0

Können Sie auch ausdrucken (oder sehen, wenn Sie in den Debugger treten), welche Klasse der Tag zurückgegeben wird? "Tag" ist nur eine Schnittstelle, also frage ich mich, ob die Implementierung, die standardmäßig ausgewählt wird, die richtige ist. – tyrel

Antwort

0

mit dem folgenden Code liest einen vorhandenen Album-Tag aus einer MP3-Datei, und dann überschreibt ihn mit einem neuen Album-Tag.

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(); 

Es wurde getestet, um mit Java 1.7 und jaudiotagger 2.2.3 auf Linux zu arbeiten.

Verwandte Themen