Чтение удаленного файла MP3 файла ID3 с помощью Java
Вопрос
Я ищу способ прочитать теги ID3 из файла MP3 на удаленном сервере, не загружая файл. Я видел библиотеки, такие как jaudiotagger и evantageged, но оба, кажется, требуют файлового объекта, а не URL или INPLEAM, который я знаю, как получить с удаленным файлом. Есть ли другая библиотека, которая может сделать это? Или есть ли способ получить правильный объект для взаимодействия с этими классами, используя URL?
Решение
Эта страница описывает, как получить ID3 V. 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
до конца файла. Это вернет необходимые метаданные. Этот Дает хорошее представление о том, как выглядит дальний запрос.
Извините, хотя я не знаю никаких библиотек, которые сделали бы это автоматически, но это не особенно сложная задача для создания добыча. Оттуда можно записать метаданные в файл TEMP и проанализировал его с помощью вашего анализатора 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();
}