使用Java读取远程MP3文件的ID3标签

我正在寻找一种从远程服务器上的MP3文件中读取ID3标签而无需实际下载文件的方法。 我见过像JAudioTagger和Entagged这样的库,但两者似乎都需要一个文件对象,而不是一个URL或InputStream,我知道如何使用远程文件。 还有另一个库可以做到这一点吗? 或者有没有办法让正确的对象使用URL与这些类进行交互?

本页介绍如何获取MP3文件的ID3 V. 1标签。 http://willcode4beer.com/parsing.jsp?set=mp3ID3

它提供了..

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

..方法,这是你想要的远程URL。 基本的想法是获取URLConnection并查询MP3中数据的长度,然后从该数字中减去128并将其用作起始参数(否则它将非常慢)。

ID3标签位于文件的最后128个(如果使用扩展标签,则为355)字节,因此您至少必须下载部分文件。 由于HTTP支持范围特定的文件访问,理论上应该可以这样做(虽然我不知道任何库会为你做这些)。

基本上需要做的是执行HEAD请求以获取文件的长度(以字节为单位),然后对文件的G length-355执行GET,并使用Range length-355到文件的末尾。 这将返回必要的元数据。 这可以很好地了解范围请求的外观。

很抱歉,虽然我不知道任何库会自动执行此操作,但设置getter并不是一项特别困难的任务。 从那里可以将元数据写入临时文件并由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