是否可以在下载整个文件之前知道MP3的持续时间?

时间:2015-02-24 20:58:01

标签: audio mp3 file-format jlayer

这是关于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);

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

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

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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:-1)

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

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

  

内容长度:30079584

下一步将从此块(link

获取 ID3大小音频比特率

例如:

  

...
  音频比特率:272 kbps
  ID3尺寸:115419
  ...

然后只使用这个公式(例子):

  

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

     

~881秒

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