如何获取音频文件的持续时间?
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();
【讨论】:
以上是关于如何获取音频文件的持续时间?的主要内容,如果未能解决你的问题,请参考以下文章
如何获取音频文件的长度而不在 Flutter/Dart 中播放