当前位置: 首页 > 知识库问答 >
问题:

媒体对象上的javafx未知持续时间

刘博文
2023-03-14

我是Java和JavaFX的新手,过去几年我一直在用QT开发Python,现在我正在用Java和JavaFX开发。

我正在开发一个程序,为用户播放音乐文件设定时间,然后停止。因此,我需要从媒体对象获取持续时间,以便告诉音频何时停止(基于用户的时间输入),但是,媒体对象上的getDuration()方法总是返回UNKNOWN。

我在Windows 8.1和openSuSE 13.2上使用JDK8u25(最新稳定版本)(两者都有相同的问题):

File filestring = new File("my/file/dir/file.mp3")
Media file = new Media(filestring.toURI().toString());
file.getDuration(); // Returns UNKNOWN on both wav and mp3 files
file.getDuration().toMinutes()) // Also tested with toHours() toSeconds(), toMilli()...
// Above returns NaN because the file's duration is unknown

作为一个测试,我把我的整个mp3音乐集(1000首带有CBR和VBR的歌曲)放在一起,让java对每个文件进行迭代,所有人都说持续时间未知。我还尝试了来自多个不同来源的wav文件(只是为了确保它不是mp3格式),看看它是否改变了,并且。。。没有什么在这段时间里什么都不知道。我还检查了标签,以确保每个其他程序都说这些文件属性中的长度或持续时间是好的。

奇怪的是,当我将媒体对象传递给媒体播放器时,文件播放得非常好。虽然我可以使用外部库来获取长度,但是由于整个程序使用java和javafx库,这将更加容易和简化。

共有3个答案

封景曜
2023-03-14

上述和接受的答案是正确的,所以你不能访问或获得总持续时间之前媒体播放器得到准备,你应该使用媒体layer.setOnNow()...

但是有时你需要更快地了解mp3文件的总持续时间。在这种情况下,您可以使用第三方库,如Apache Tika。要使用它,您可以将以下依赖项导入到您的pom.xml文件:

<!-- Apache Tika: detects and extracts metadata and text from a variety of files -->
<dependency>
    <groupId>org.apache.tika</groupId>
    <artifactId>tika-core</artifactId>
    <version>2.0.0</version>
</dependency>


<!--Apache Tika AudioVideo Parser Module-->
<dependency>
    <groupId>org.apache.tika</groupId>
    <artifactId>tika-parser-audiovideo-module</artifactId>
    <version>2.0.0</version>
</dependency>

您可以按如下方式找到媒体文件的持续时间:

InputStream input = new FileInputStream(browsedFile.getFilePath());
ContentHandler handler = new DefaultHandler();
Metadata metadata = new Metadata();
Parser parser = new Mp3Parser();
ParseContext parseCtx = new ParseContext();
parser.parse(input, handler, metadata, parseCtx);
input.close();
Long duration = Long.parseLong(metadata.get("xmpDM:duration").split("\\.")[0]);

当然,你可以用更容易理解的格式来格式化它:

String formattedDuration = String.format("%02d:%02d:%02d", duration / 3600, (duration % 3600) / 60, (duration % 60));
陈毅
2023-03-14

看起来媒体需要一些时间才能完全初始化。在getDuration行之前添加一个线程睡眠,然后重试!

彭涵衍
2023-03-14

如果你读了Media类的javadoc,它说你应该等待媒体播放器准备好:

媒体信息是异步获取的,因此不一定在类实例化后立即可用。但是,如果实例已与MediaPlayer关联,并且该播放器已转换为状态,则所有信息都应可用。就绪状态

因此,您只需要创建一个MediaPlayer实例并监听状态。READY

    File filestring = new File("my/file/dir/file.mp3");
    Media file = new Media(filestring.toURI().toString());  

    MediaPlayer mediaPlayer = new MediaPlayer(file);

    mediaPlayer.setOnReady(new Runnable() {

        @Override
        public void run() {

            System.out.println("Duration: "+file.getDuration().toSeconds());

            // display media's metadata
            for (Map.Entry<String, Object> entry : file.getMetadata().entrySet()){
                System.out.println(entry.getKey() + ": " + entry.getValue());
            }

            // play if you want
            mediaPlayer.play();
        }
    });
 类似资料:
  • 问题内容: 我是Java和JavaFX的新手,最近几年我一直在使用QT在Python上进行开发,现在我正在使用Java和JavaFX进行开发。 我正在开发一个程序,该程序可以为用户设置时间播放音乐文件,然后停止播放。因此,我需要从媒体对象获取持续时间以告诉音频何时停止(基于用户输入的时间),但是,媒体对象上的getDuration()方法始终返回UNKNOWN。 我在Windows 8.1和ope

  • 媒体对象是一些抽象元素,是用来建立复杂繁琐组件(比如说博客评论、推文等)的基础。它支持左对齐内容、右对齐内容、内容对齐选项、嵌套,等等。 注意! 如果启用了弹性盒模式,媒体对象将尽可能地使用flex样式。 默认媒体 默认媒体允许让媒体对象(图片、视频、音频)在内容块中向左浮动或向右浮动。 <div class="media"> <a class="media-left" href="#">

  • 主要内容:实例,实例,实例,实例本章我们将讲解 Bootstrap 中的多媒体对象(Media Object),如:图像、视频、音频等。 多媒体对象的样式可用于创建各种类型的组件(比如:博客评论),我们可以在组件中使用图文混排,图像可以左对齐或者右对齐。媒体对象可以用更少的代码来实现媒体对象与文字的混排。 接下来我们先来看个实例: 实例 <!-- 左对齐 --> <div class="media"> <div class="m

  • 主要内容:基础多媒体对象,实例,多媒体对象嵌套,实例,多媒体对象图片显示在右边,实例,定位多媒体图片位置,实例Bootstrap 提供了很好的方式来处理多媒体对象(图片或视频)和内容的布局。应用场景有博客评论、微博等: 基础多媒体对象 要创建一个多媒体对象,可以在容器元素上添加 .media 类,然后将多媒体内容放到子容器上,子容器需要添加 .media-body 类,然后添加外边距,内边距等效果: 实例 <div class="media border p-3"> <img decoding=

  • 本章讨论Media对象。 这些是抽象对象样式,用于构建各种类型的组件(如博客评论,推文等),这些组件在文本内容旁边具有左对齐或右对齐图像。 媒体对象的目标是使用于开发这些信息块的代码大大缩短。 媒体对象的目标(轻量级标记,易扩展性)是通过将类应用于某些简单标记来实现的。 媒体对象有两种形式 - .media - 此类允许将媒体对象(图像,视频和音频)浮动到内容块的左侧或右侧。 .media-lis

  • 本文向大家介绍Bootstrap媒体对象的实现,包括了Bootstrap媒体对象的实现的使用技巧和注意事项,需要的朋友参考一下 在web页面中,图片居左,内容居右排列,是非常常见的效果,它也就是媒体对象,它是一种抽象的样式,可以用来构建不同类型的组件,在bootstrap框架中其对应的版本文件如下: LESS: media.less SASS: _media.scss 媒体对象一般是成组出现,一组