Lesen Fern für ID3-Tags der MP3-Datei mit Java
Frage
Ich bin auf der Suche nach einer Möglichkeit, die ID3-Tags von MP3-Datei auf einem Remote-Server zu lesen, ohne die Datei tatsächlich herunterladen. Ich habe Bibliotheken wie JAudioTagger und Entagged gesehen, aber beide scheinen ein Dateiobjekt und keinen URL oder Input zu erfordern, was ich weiß, wie man mit einer Remote-Datei zu erhalten. Gibt es eine andere Bibliothek, die dies tun können? Oder ist es eine Möglichkeit, das richtige Objekt zu bekommen, um die Interaktion mit diesen Klassen einer URL mit?
Lösung
Diese Seite beschreibt, wie die ID3 V erhalten. 1 Tags einer MP3-Datei. http://willcode4beer.com/parsing.jsp?set=mp3ID3
Es bietet eine ..
public Tag readTag(InputStream in, long start) throws ..
.. Verfahren, das ist, was Sie für eine Remote-URL wollen. Die grundlegende Idee wäre, eine URLConnection & Abfrage es für die Länge der Daten im MP3 zu bekommen, dann subtrahiert 128 von dieser Zahl und verwendet, die als Startargument (sonst wird es sehr langsam) .
Andere Tipps
ID3-Tags werden in den letzten 128 befindet (355, wenn erweiterte-Tag) Bytes der Datei, so dass Sie gehen, zumindest müssen Download ist Teil der Datei. Da HTTP unterstützt bestimmten Dateizugriffsbereich sollte es theoretisch möglich sein, dies zu tun (obwohl ich weiß nicht von irgendwelchen Bibliotheken, die es für Sie tun würden).
Im Grunde müßte geschehen, was ist eine HEAD-Anfrage zu tun, um die Länge der Datei in Bytes zu erhalten, dann ein GET auf die Datei mit dem Bereich length-355
bis zum Ende der Datei ausführen. Dies würde die notwendigen Metadaten zurück. gibt Dieses eine gute Vorstellung davon, was ein reichte Anfrage aussieht.
Leider aber, dass ich nicht weiß, von irgendwelchen Bibliotheken, die dies automatisch tun würden, aber es ist nicht eine besonders schwierige Aufgabe, den Getter einzurichten. Von dort aus ist es möglich, die Metadaten in eine temporäre Datei zu schreiben und lassen Sie es von Ihrem ID3-Parser analysiert.
String tmp="";
int bytes_read;
try{
//RandomAccessFile file = new RandomAccessFile("/mnt/sdcard/Music/6 am (reggaeton).mp3", "r");
RandomAccessFile file = new RandomAccessFile("/mnt/sdcard/Music/Jorge Vercilo - Final feliz.mp3", "r");
long fsize=file.length();
System.out.println("Abriu arquivo");
byte[] buf = new byte[1024];
bytes_read = file.read(buf, 0, 10);
System.out.println("Leu "+String.valueOf(bytes_read));
if(bytes_read==10){
if(buf[0] == 'I' &&buf[1] == 'D' && buf[2] == '3') {
System.out.println("É ID3");
int version = (buf[4]<<8) + (buf[3] & 0xff);
System.out.println("Versão: "+String.valueOf(version));
if(buf[5] == 0x00) System.out.println("Clear flags");
long size = ((buf[9] & 0xFF) << 0) |
((buf[8] & 0xFF) << 8) |
((buf[7] & 0xFF) << 16) |
((buf[6] & 0xFF) << 24);
System.out.println("Size: "+String.valueOf(size));
long p = 10;
long frame_size;
String encoding="";
while(p<fsize){
file.seek(p);
bytes_read = file.read(buf, 0, 10);
if(bytes_read==10){
frame_size = ((buf[7] & 0xFF) << 0) |
((buf[6] & 0xFF) << 8) |
((buf[5] & 0xFF) << 16) |
((buf[4] & 0xFF) << 24);
System.out.println("Frame size: "+String.valueOf(frame_size));
tmp = new String(buf,0,4);
System.out.println("Frame type: "+tmp);
if(buf[0] == 'T' && buf[1] == 'P' && buf[2] == 'E' && buf[3] == '1') {// artist
p+=10;
file.seek(p);
if(file.read(buf, 0, (int)frame_size)==frame_size){
if(buf[0]==0x01) encoding="UTF-16";
else if(buf[0]==0x02) encoding="UTF-16BE";
else if(buf[0]==0x03) encoding="UTF-8";
if(buf[0]==0x00) tmp = new String(buf,1,(int)frame_size-1);
else tmp = new String(buf,1,(int)frame_size-1,encoding);
System.out.println("Artist: "+tmp);
}
p+=frame_size;
}
else if(buf[0] == 'T' && buf[1] == 'I' && buf[2] == 'T' && buf[3] == '2') {// title
p+=10;
file.seek(p);
if(file.read(buf, 0, (int)frame_size)==frame_size){
if(buf[0]==0x01) encoding="UTF-16";
else if(buf[0]==0x02) encoding="UTF-16BE";
else if(buf[0]==0x03) encoding="UTF-8";
if(buf[0]==0x00) tmp = new String(buf,1,(int)frame_size-1);
else tmp = new String(buf,1,(int)frame_size-1,encoding);
System.out.println("title: "+tmp);
}
p+=frame_size;
}
else if(buf[0] == 0x00 && buf[1] == 0x00 && buf[2] == 0x00 && buf[3] == 0x00) {// END OF HEADER
break;
}
else p+= frame_size+10;
}
//checar se ja pegou o title e o artist
}
}
}
if(file!=null) file.close();
}catch(Exception e){
System.out.println("ERROOOOOOOOO!");
e.printStackTrace();
}