Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何从其URL获取MP3的长度?_Java_Url_Properties_Mp3 - Fatal编程技术网

Java 如何从其URL获取MP3的长度?

Java 如何从其URL获取MP3的长度?,java,url,properties,mp3,Java,Url,Properties,Mp3,如果我知道MP3文件的URL,那么获取其长度、比特率、大小等的最简单/最快方法是什么 如何仅下载MP3的ID3标签部分来获取这些详细信息?您无法仅从URL获取这些信息 您必须加载前几K个内容,并使用mp3库对标题进行解码并获取值。您需要查看mp3文件中的ID3标记 除非您在其他地方跟踪所需的元数据 要具体获取文件的跟踪长度,您需要查看ID3元数据标记,特别是标记的“TRCK”框架 要仅下载ID3标记部分,必须首先下载文件的ID3头部分 这包含关于ID3标记格式的非常具体的信息。您需要查看ID3标

如果我知道MP3文件的URL,那么获取其长度、比特率、大小等的最简单/最快方法是什么


如何仅下载MP3的ID3标签部分来获取这些详细信息?

您无法仅从URL获取这些信息


您必须加载前几K个内容,并使用mp3库对标题进行解码并获取值。

您需要查看mp3文件中的ID3标记

除非您在其他地方跟踪所需的元数据

要具体获取文件的跟踪长度,您需要查看ID3元数据标记,特别是标记的“TRCK”框架

要仅下载ID3标记部分,必须首先下载文件的ID3头部分

这包含关于ID3标记格式的非常具体的信息。您需要查看ID3标记的版本号,然后在此基础上,您需要找到有关ID3标记的长度的信息。然后,您必须下载整个标记,因为帧没有任何特定的顺序


然后,您应该能够使用第三方库来查找TRCK帧及其数据。

该数据编码在id3标记中,因此您至少需要下载该文件的大部分,这是在开始时,因此您很幸运


或者,您可以查看http响应标头中的content length标头值以了解长度,如果服务器告诉您可能不知道该值。

以下是获取文件大小的方法,但如何获取比特率和磁道长度

import java.io.*;
import java.net.*;

public class FileSizeFromURL {
public static final void main(String[] args) {
URL url;
URLConnection conn;
int size;

if(args.length != 1) {
  System.out.println("Usage: FileSizeFromURL ");
  return;
  }

try {
  url = new URL(args[0]);
  conn = url.openConnection();
  size = conn.getContentLength();
  if(size < 0)
     System.out.println("Could not determine file size.");
  else
    System.out.println(args[0] + "\nSize: " + size);
  conn.getInputStream().close();
  } 
catch(Exception e) {
  e.printStackTrace();
  }
}
}
import java.io.*;
导入java.net。*;
公共类FileSizeFromURL{
公共静态最终void main(字符串[]args){
网址;
连接连接;
整数大小;
如果(args.length!=1){
System.out.println(“用法:FileSizeFromURL”);
返回;
}
试一试{
url=新url(参数[0]);
conn=url.openConnection();
size=conn.getContentLength();
如果(尺寸<0)
System.out.println(“无法确定文件大小”);
其他的
System.out.println(参数[0]+“\n大小:”+size);
conn.getInputStream().close();
} 
捕获(例外e){
e、 printStackTrace();
}
}
}
获取其长度、比特率、大小等的最简单/最快方法是什么

通过HTTP头请求可以获得的文件大小。如果“长度”指的是以秒为单位的播放时间,则在不获取整个文件的情况下,无法获取该长度。通过获取前几个MP3帧,查看它们的比特率,并假设文件的其余部分具有相同的比特率,您可以猜测,但鉴于可变比特率编码的流行,接近准确的可能性非常低

ID3标签理论上可以包含一些信息,这些信息可以让您更好地猜测ASPI和ETCO标签中的长度。但在实践中,这些情况很少出现

我如何下载MP3的ID3标签部分来获得这些详细信息

对于ID3v2标记,抓取文件的开头。(ID3v2帧可能位于其他位置,但实际上它们总是在那里。)您无法预知标记将提前多长时间。对于纯文本标记,您可能会在前512-1024字节中找到所需的信息。不幸的是,越来越多的MP3嵌入了“相册艺术”图片,这些图片可能会更长;尝试选择一个ID3库,它将优雅地忽略截断的ID3信息

ID3v1标记位于文件的末尾。同样,你也不知道它们会持续多久。当然,您事先不知道文件是否有ID3v1标记,ID3v2标记,两者都有,或者两者都没有。一般来说,现在ID3v2是一个更好的选择

要通过HTTP读取文件的一部分,需要标头。并非所有地方都支持这一点


总之,这方面的问题已经够多了,最好的选择可能是放弃,只获取整个文件。

我在被问到这个问题一年多后才回答这个问题,但我确实有一些信息要补充,以供以后参考。我回答了一个类似的问题,即从远程服务器上的图像获取图像尺寸,而不下载整个图像。请参见以下URL上的讨论:

您完全可以使用相同的技术从ID3标签中提取信息,而无需从远程服务器下载整个MP3


我希望这对未来的过路人有所帮助。

尝试其他答案中的建议?最好是将此作为一个头部请求,而不是获得。请参见例如HttpURLConnection.setRequestMethod。