Javaを使用して、リモートMP3ファイルのID3タグを読み取ります
質問
実際にファイルをダウンロードすることなく、リモートサーバー上のMP3ファイルからID3タグを読む方法を探しています。 JaudiotaggerやEntaggedのようなライブラリを見てきましたが、どちらもファイルオブジェクトを必要としているようで、URLやinputStreamではなく、リモートファイルで取得する方法を知っています。これを行うことができる別のライブラリはありますか?または、URLを使用してこれらのクラスと対話する正しいオブジェクトを取得する方法はありますか?
解決
このページでは、ID3を取得する方法について説明します V. 1 mp3ファイルのタグ。 http://willcode4beer.com/parsing.jsp?set=mp3Id3
それはを提供します。
public Tag readTag(InputStream in, long start) throws ..
..それがあなたがリモートURLに望むものであることです。基本的なアイデアは、urlconnectionを取得し、mp3のデータの長さを照会し、その数値から128を減算し、それを開始引数として使用することです(それ以外 非常に スロー)。
他のヒント
ID3タグは、ファイルの最後の128(拡張タグを使用している場合は355)にあるため、少なくともファイルの一部をダウンロードする必要があります。 HTTPは範囲固有のファイルアクセスをサポートしているため、理論的にはこれを行うことが可能です(ただし、私はあなたのためにそれを行うライブラリを知りませんが)。
基本的に、ファイルの長さをバイト単位で取得するためにヘッドリクエストを実行し、範囲のファイルでGetを実行することです 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();
}