4

这是一个关于 MP3 文件格式的问题。

我一直在寻找一种获得 MP3 持续时间的方法。由于我使用 JLayer SPI 解码 MP3,我发现在音频源是文件的情况下这是可能的。

AudioFileFormat fileFormat = AudioSystem.getAudioFileFormat(source);
Long microseconds = (Long) fileFormat.properties().get("duration");
System.out.println(microseconds);

但是,当我采用类似的代码和相同的 MP3 并将源更改为 URL 时,JLayer 不提供持续时间:

AudioFileFormat fileFormat = AudioSystem.getAudioFileFormat(source.toURI().toURL());
Long microseconds = (Long) fileFormat.properties().get("duration");
System.out.println(microseconds);

这是一个重要的区别,因为我想播放的一些音乐将来自 URL 而不是本地文件。

我怀疑这是由于文件格式的限制。

这引出了一个非常简单的问题。是否可以在下载整个文件之前知道 MP3 的持续时间?

4

2 回答 2

2

答案是不。mp3 文件格式没有关于文件持续时间的任何信息。要计算持续时间,您需要将文件的长度除以比特率。这也可以解释你的图书馆的行为。作为一种解决方法,如果您可以控制服务器上的文件,您应该能够将持续时间嵌入 id3 标记中。

于 2015-02-24T21:14:28.400 回答
-1

是的,对于CBR(恒定比特率),您需要下载大约 1-2 MBytes* 的块(必须大于下面的id3 大小

在标题中,您通常可以找到整个文件长度:

内容长度:30079584

下一步是从此块中获取音频比特率和ID3大小(使用exiftool -link

例如:

...
音频比特率:272 kbps
ID3 大小:115419
...

然后只需使用此公式(示例):

(30079584 - 115419) / (272 * 1000 / 8)

~ 881 秒

其中 ' * 1000 / 8 ' - 是 kbit 到字节的转换 ( https://en.wikipedia.org/wiki/Bit_rate )

于 2018-04-13T10:48:13.613 回答