如何获取音频文件的持续时间?

Posted

技术标签:

【中文标题】如何获取音频文件的持续时间?【英文标题】:How to get duration of audio file? 【发布时间】:2015-05-12 06:44:48 【问题描述】:

我想以秒为单位获取音频文件的持续时间(总时间)。音频文件可以是任何格式的 I.E. (.mp3、.wav、.wma 等)。

 try 
    File file = new File("C:/Users/Administrator/AppData/Local/Temp/" + 
        "01 - Ab Tere Bin Jee Lenge Hum-(MyMp3Singer.com).mp3");
    AudioInputStream audioInputStream = Audiosystem.getAudioInputStream(file);
    AudioFormat format = audioInputStream.getFormat();
    long frames = audioInputStream.getFrameLength();
    double durationInSeconds = (frames + 0.0) / format.getFrameRate();
    System.out.println("duration in seconds"+durationInSeconds);
    AudioFileFormat audioFileFormat = AudioSystem.getAudioFileFormat(file);
    Map<String, Object> properties = audioFileFormat.properties();
    System.out.println("properties"+properties.size()+"empy::"+properties.isEmpty());
    for(String key: properties.keySet())
        System.out.println(key  +" :: "+ properties.get(key).toString());
    
 catch (Exception e) 
    System.out.println("Exception:::::" + e.getMessage());

我尝试使用上面的代码执行此操作,但它给出了:

Exception:::::could not get audio input stream from input file

【问题讨论】:

***.com/questions/3009908/… 【参考方案1】:

您可能缺少 MP3 编解码器。你可能想试试Tritonus: Open Source Java Sound。

同时查看相关线程:MP3 playback using Java Sound and Sun MP3 plugin

【讨论】:

如果是库,请提供示例程序以获取音频文件持续时间 @programminglover:- 你写的程序是正确的。你只需要在你的类路径中添加一些像jl.jar mp3spi.jar and tritonus_share.jar to my classpath这样的jar文件 另见Java Sound Wiki 的服务提供者接口 & MP3 解码支持 部分。 JMF 包含一个 MP3 解码器。在运行时类路径中包含mp3plugin.jar(名称?),您应该可以开始使用了。我将它用于基于 Java Sound 的 MP3 点唱机。【参考方案2】:

音频文件的持续时间通常作为AudioFileFormat 的属性提供。来自docs:

下表列出了应在实现中使用的一些常见属性:

音频文件格式属性

+-------------+------------+-----------------------------------------------+
|Property key | Value type | Description                                   | 
|-------------|------------|-----------------------------------------------|
| "duration"  | Long       | playback duration of the file in microseconds |
| "author"    | String     | name of the author of this file               |
| "title"     | String     | title of this file                            |
| "copyright" | String     | copyright message                             |
| "date"      | Date       | date of the recording or release              |
| "comment"   | String     | an arbitrary text                             |
+-------------+------------+-----------------------------------------------+

注意应该,表示它们是可选的。

另请注意,duration微秒 为单位,而不是毫秒!

所以要在 Java 中获取音频文件的持续时间,您可以调用:

final String DURATION = "duration";
Long duration = (Long)audioFileFormat.properties().get(DURATION);

// and because duration is optional, use a fallback
// for uncompressed formats like AIFF and WAVE
if (duration == null
    && audioFileFormat.getFormat().getEncoding() == PCM_SIGNED
    // make sure we actually have a frame length
    && audioFileFormat.getFrameLength() != NOT_SPECIFIED
    // make sure we actually have a frame rate
    && audioFileFormat.getFormat().getFrameRate() != NOT_SPECIFIED
    // check if this is WAVE or AIFF, other uncompressed formats may work as well
    && (audioFileFormat.getType() == WAVE || audioFileFormat.getType() == AIFF)) 

    duration = (long) (audioFileFormat.getFrameLength() / audioFileFormat.getFormat().getFrameRate() * 1000L * 1000L);

这个 sn-p 可以从 duration 属性或帧长度和帧速率中获取以微秒为单位的持续时间。 后者仅对 WAVE 或 AIFF 等未压缩格式有用

由于当前 JVM 开箱即用不支持 mp3,因此您需要安装 mp3 编解码器。这以实现Service Provider Interface (SPI) 的服务提供者的形式出现。用于 mp3 的 SPI 的纯 Java 实现是 Tritonus 库。有关 Maven 的用法,请参阅例如 here。请注意,该库显然在很久以前就被废弃了。使用CoreAudio for Mac 的更新包是CASampledSP。另一个基于 FFmpeg 并为 Mac 和 Windows 编写的库是 FFSampledSP(完全披露:我是这两个库的作者)。

获取持续时间的另一种稍微不同寻常的方法是使用 JavaFX,因为它支持开箱即用的 mp3:

import java.io.File;
import javafx.scene.media.Media;
import javafx.util.Duration;

final Media media = new Media(new File("somefile.mp3").toURI().toString());
final Duration duration = media.duration();

【讨论】:

以上是关于如何获取音频文件的持续时间?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 iOS 中获取音频文件的持续时间?

如何从颤动的路径中获取音频元数据?

如何获取音频文件的长度而不在 Flutter/Dart 中播放

如何将 JProgressBar 设置为音频文件的持续时间?

ios中的音频流持续时间

如何获取媒体播放器持续时间并停止 Chronometer?