سؤال

أبحث عن طريقة لقراءة علامات ID3 من ملف MP3 على خادم بعيد دون تنزيل الملف فعليًا. لقد رأيت مكتبات مثل Jauditagger و Endaged ، لكن يبدو أن كلاهما يتطلب كائن ملف وليس عنوان URL أو InputStream ، والذي أعرف كيفية الحصول عليه مع ملف بعيد. هل هناك مكتبة أخرى يمكنها القيام بذلك؟ أم أن هناك طريقة للحصول على الكائن الصحيح للتفاعل مع هذه الفئات باستخدام عنوان URL؟

هل كانت مفيدة؟

المحلول

تصف هذه الصفحة كيفية الحصول على ID3 خامسا 1 علامات ملف mp3. http://willcode4beer.com/parsing.jsp؟set=mp3id3

يقدم ..

public Tag readTag(InputStream in, long start) throws ..

..Method هذا ما تريده لعنوان URL البعيد. تتمثل الفكرة الأساسية في الحصول على urlconnection والاستعلام عنها لطول البيانات في MP3 ، ثم قم بطرح 128 من هذا الرقم واستخدام ذلك كوسيطة ابدأ (وإلا جداً بطيء).

نصائح أخرى

توجد علامات ID3 في آخر 128 (355 إذا كنت تستخدم علامة ممتدة) بايت للملف ، لذلك عليك على الأقل تنزيل جزء من الملف. نظرًا لأن HTTP يدعم الوصول إلى الملفات المحددة ، يجب أن يكون من الممكن نظريًا القيام بذلك (على الرغم من أنني لا أعرف أي مكتبات من شأنها أن تفعل ذلك من أجلك).

ما يجب أن يحدث في الأساس هو تقديم طلب رأس للحصول على طول الملف بالبايت ، ثم تنفيذ الحصول على الملف مع النطاق length-355 إلى نهاية الملف. هذا من شأنه أن يعيد البيانات الوصفية اللازمة. هذه يعطي فكرة جيدة عما يبدو عليه طلب تراوح.

عذرًا على الرغم من أنني لا أعرف أي مكتبات من شأنها أن تفعل ذلك تلقائيًا ، لكن ليس من الصعب للغاية إعداد الجائزة. من هناك ، من الممكن كتابة البيانات الوصفية إلى ملف مؤقت وتحليلها بواسطة محلل ID3 الخاص بك.

    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();
    }   
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top