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

Phi*_*ing 6 audio mp3 file-format duration jlayer

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

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

AudioFileFormat fileFormat = AudioSystem.getAudioFileFormat(source);
Long microseconds = (Long) fileFormat.properties().get("duration");
System.out.println(microseconds);
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

jak*_*ket 2

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

  • VBR 文件通常有一个包含文件总长度的标头(以帧为单位;每帧 1152 个样本,除非 MPEG2,在这种情况下为 576)。查找 Xing 和 VBRI 格式标头(它们位于第一个 MPEG 帧的辅助数据中...)。 (4认同)
  • “要计算持续时间,您需要将文件的长度除以比特率。”我认为,当您拥有可变比特率 mp3 时,此方法就会失效(就像现在大多数情况一样)。 (2认同)