【问题标题】:Is it possible to know the duration of an MP3 before the entire file is downloaded?是否可以在下载整个文件之前知道 MP3 的持续时间?
【发布时间】:2015-04-26 16:24:42
【问题描述】:

这是一个关于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 的持续时间?

【问题讨论】:

    标签: audio mp3 duration file-format jlayer


    【解决方案1】:

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

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

    内容长度:30079584

    下一步是从这个块中获取 Audio BitrateID3 Size(使用 exiftool - link

    例如:

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

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

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

    ~ 881 秒

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

    【讨论】:

    • 如果我理解正确,您的建议是假设恒定比特率,您无法检查比特率是否真的恒定。
    【解决方案2】:

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

    【讨论】:

    • To compute the duration you would need to divide the length of the file by the bit rate. 我认为这种方法在您拥有可变比特率 mp3 的那一刻就会失败(就像现在大多数情况一样)。
    • VBR 文件通常有一个包含文件总长度的标题(以帧为单位;每帧 1152 个样本,除非 MPEG2,在这种情况下为 576)。寻找 Xing 和 VBRI 格式的标头(它们被放置在第一个 MPEG 帧的辅助数据中......)。
    猜你喜欢
    • 2012-06-14
    • 2013-05-12
    • 2019-10-26
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-09
    相关资源
    最近更新 更多