是否可以在下载整个文件之前知道 MP3 的持续时间?
Is it possible to know the duration of an MP3 before the entire file is downloaded?
这是一个关于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 的持续时间?
答案是否定的。 mp3 文件格式没有关于文件持续时间的任何信息。要计算持续时间,您需要将文件的长度除以比特率。这也可以解释您的图书馆的行为。作为解决方法,如果您可以控制服务器上的文件,您应该能够将持续时间嵌入到 id3 标记中。
是的,对于 CBR(恒定比特率),您需要下载大约 1-2 MBytes* 的块(必须大于 id3 大小以下)
在 header 中,您通常可以找到整个文件长度:
Content-Length: 30079584
下一步是从该块中获取 音频比特率 和 ID3 大小(使用 exiftool - link)
例如:
...
Audio Bitrate: 272 kbps
ID3 Size : 115419
...
然后只需使用此公式(示例):
(30079584 - 115419) / (272 * 1000 / 8)
~ 881 seconds
其中 '* 1000 / 8' - 是一个 kbit-to-bytes 转换 (https://en.wikipedia.org/wiki/Bit_rate)
这是一个关于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 的持续时间?
答案是否定的。 mp3 文件格式没有关于文件持续时间的任何信息。要计算持续时间,您需要将文件的长度除以比特率。这也可以解释您的图书馆的行为。作为解决方法,如果您可以控制服务器上的文件,您应该能够将持续时间嵌入到 id3 标记中。
是的,对于 CBR(恒定比特率),您需要下载大约 1-2 MBytes* 的块(必须大于 id3 大小以下)
在 header 中,您通常可以找到整个文件长度:
Content-Length: 30079584
下一步是从该块中获取 音频比特率 和 ID3 大小(使用 exiftool - link)
例如:
...
Audio Bitrate: 272 kbps
ID3 Size : 115419
...
然后只需使用此公式(示例):
(30079584 - 115419) / (272 * 1000 / 8)
~ 881 seconds
其中 '* 1000 / 8' - 是一个 kbit-to-bytes 转换 (https://en.wikipedia.org/wiki/Bit_rate)