【发布时间】:2009-03-09 01:43:37
【问题描述】:
如果我知道 MP3 文件的 URL,获取其长度、比特率、大小等的最简单/最快的方法是什么?
如何仅下载 MP3 的 ID3 标签部分以获取这些详细信息?
【问题讨论】:
标签: java url properties mp3
如果我知道 MP3 文件的 URL,获取其长度、比特率、大小等的最简单/最快的方法是什么?
如何仅下载 MP3 的 ID3 标签部分以获取这些详细信息?
【问题讨论】:
标签: java url properties mp3
您需要查看 mp3 文件中的 ID3 标签。
除非您在其他地方跟踪所需的元数据。
要具体获取文件的轨道长度,您需要确定查看 ID3 元数据标签,特别是标签的“TRCK”框架。
如果只下载ID3 Tag部分,必须先下载文件的ID3 header部分。
website 包含有关 ID3 标记格式的非常具体的信息。您将需要查看 ID3 Tag 的版本号,然后基于此,您需要找到有关 ID3 Tag 多长时间的信息。然后,您必须下载整个标签,因为帧没有任何特定的顺序。
那么您应该可以使用第三方库来查找 TRCK 框架及其数据。
【讨论】:
这是获取文件大小的方法,但如何获取比特率和音轨长度?
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();
}
}
}
【讨论】:
获取其长度、比特率、大小等的最简单/最快的方法是什么?
您可以通过 HTTP HEAD 请求获得的文件大小。如果“长度”是指播放时间(以秒为单位),则如果不获取整个文件,您将无法获得此信息。您可以猜测,通过获取前几个 MP3 帧,查看它们的比特率,并假设文件的其余部分具有相同的比特率,但考虑到可变比特率编码的流行,这种可能性将接近准确率相当低。
ID3 标签理论上可以在 ASPI 和 ETCO 标签中包含可以让您更好地猜测长度的信息。但实际上这些很少出现。
如何仅下载 MP3 的 ID3 标签部分以获取这些详细信息?
对于 ID3v2 标签,抓取文件的开头。 (ID3v2 帧可能在其他地方,但实际上它们总是在那里。)您无法提前知道标签将存在多长时间。对于纯文本标签,您可能会在前 512-1024 个字节中找到您想要的信息。不幸的是,越来越多的 MP3 嵌入了“专辑封面”图片,这些图片可能会更长;尝试选择一个可以优雅地忽略截断的 ID3 信息的 ID3 库。
ID3v1 标签位于文件末尾。同样,您无法确定它们会持续多长时间。当然,您事先并不知道该文件是否具有 ID3v1 标签、ID3v2 标签,或者两者都没有。不过现在一般来说 ID3v2 是更好的选择。
要通过 HTTP 读取文件的一部分,您需要 Range 标头。这也不是所有地方都支持的。
总之,这有很多问题,最好的选择可能是放弃并只获取整个文件。
【讨论】:
我在这个问题被问到一年后才回答这个问题,但我确实有一些信息可以为以后发生的事情添加一些信息。我回答了一个类似的问题,即在不下载整个图像的情况下从远程服务器上的图像中获取图像尺寸。请参阅以下 URL 中的讨论:
Get image dimensions with Curl
您绝对可以使用相同的技术从 ID3 标签中提取信息,而无需从远程服务器下载整个 MP3。
希望对以后的路人有所帮助。
【讨论】:
您无法仅从 URL 获取此信息。
您必须加载前几 K 的内容并使用 mp3 库来解码标题并获取值。
【讨论】:
该数据在 id3 标记中编码,因此您至少需要下载该文件的大部分内容,该文件位于开头,所以您很幸运。
或者,您可以查看 http 响应标头中的 content-length 标头值以了解长度,如果服务器告诉您它可能没有。
【讨论】: