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?

War es hilfreich?

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();
    }   
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top