【问题标题】:Correct way to check if JavaFX MediaPlayer can play a file检查JavaFX MediaPlayer是否可以播放文件的正确方法
【发布时间】:2017-11-04 10:57:40
【问题描述】:

目前,这是我检查文件是否可通过 JavaFX MediaPlayer 播放的方式,因为这是在内部完成的方式。

import static com.sun.media.jfxmedia.MediaManager.canPlayContentType;
import static com.sun.media.jfxmediaimpl.MediaUtils.filenameToContentType;

public boolean isPlayable(String filename) {
    return canPlayContentType(filenameToContentType(filename));
}

问题在于,包含这些方法的包“不是 API”,在 Java 9 上不再可访问。我知道有一些解决方法,但我想知道是否有一种真正正确、面向未来的方法?

我希望这种方法能够用目录中的所有可播放内容填充库:

Files.find(folderPath, Integer.MAX_VALUE, (path, attr) -> 
        attr.isRegularFile() && isPlayable(path.toFile().getName()))
        .forEach(path -> addSong(path));

【问题讨论】:

    标签: java javafx media-player java-9 audio-player


    【解决方案1】:

    为了找到任何此类内置 API,我浏览了 javafx.media 模块的文档,但找不到。


    看一下filenameToContentType(String filename)的现有实现,有点:-

    if (extension.equals(FILE_TYPE_AIF) || extension.equals(FILE_TYPE_AIFF)) {
        contentType = CONTENT_TYPE_AIFF;
    } else if ... other content types
    

    这最终会检查当前文件扩展名是否为the supported container type 之一,并基于相同的内容返回内容类型。

    董事会的另一块至关重要的是canPlayContentType(String contentType),它似乎最终依赖于NativeMediaManager 类中定义的每个平台的supportedContentTypes


    虽然我没有测试下面建议的解决方案,主要是因为不了解您最终打算执行的任务的概述。然而,最接近您当前的实现以及 Basic PlayBack guidelines 的建议是尝试


    此外,异常类型MediaException.Type MEDIA_UNSUPPORTED 指出

    表示此平台不支持此媒体类型。

    通过与 this 和您当前的解决方案的类比,您可能可以使用 this:

    private static boolean isPlayable(String filename) {
        try {
            Media media = new Media(filename);
        } catch (MediaException e) {
            if (e.getType() == MediaException.Type.MEDIA_UNSUPPORTED) {
                return false;
            }
        }
        return true;
    }
    

    PS:虽然我相信如果你真正开始在你的一段代码,而不是直接删除它。

    【讨论】:

    • 是的,我已经想到了这一点,尽管我不认为捕获异常应该是处理这个问题的首选方法。现在,由于我存储了整个对象库,在某些情况下可能多达 40,000 个,我想知道文件对象或媒体对象是否具有更大的内存占用。
    • 我现在遇到了一个大问题:Media 对象锁定了相应的文件,这使我无法在此之后直接读取它的标签...
    • @Xerus 不确定,你最终的实现是什么,但我们可以再问一个问题吗(只是要求避免任何间接相关的问题)?
    猜你喜欢
    • 1970-01-01
    • 2017-10-01
    • 2012-04-27
    • 1970-01-01
    • 1970-01-01
    • 2022-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多