检查 JavaFX MediaPlayer 是否可以播放文件的正确方法

问题描述 投票:0回答:2

目前,这就是我检查文件是否可以通过 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
2个回答
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

最终检查当前文件扩展名是否是支持的容器类型之一,并基于相同的内容类型返回内容类型。

板上的另一块至关重要的是

canPlayContentType(String contentType)
,它似乎最终依赖于
supportedContentTypes
类中定义的每个平台的
NativeMediaManager


虽然我没有测试下面提出的解决方案,主要是因为不了解您最终打算执行的任务的概述。然而,最接近您当前实现以及基本播放指南建议的方法是尝试


此外,异常类型

MediaException.Type MEDIA_UNSUPPORTED
指出

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

通过与此和您当前的解决方案进行类比,您可能可以利用此:

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:虽然我相信如果你真的开始在你的代码中立即使用构造的

Media
(如上面的存根)而不是直接删除它,这可以进一步优化。


0
投票

试试这个

//make a class like this
public class FindSongs extends SimpleFileVisitor<Path> {
    public static LinkedList<Path> songPaths = new LinkedList<>();
    @Override
    public FileVisitResult visitFile(Path path, BasicFileAttributes attr) {
        try{
            //System.out.println(path.toString());
            Media media = new Media(path.toUri().toString());
            MediaPlayer mediaPlayer = new MediaPlayer(media);
            mediaPlayer.dispose();
            songPaths.add(path);
        }catch(Exception ex){
            //ex.printStackTrace();
            System.out.println("not playable: "+path.toString());
        }
        
        return CONTINUE;
    }
}

//run this
Files.walkFileTree(Paths.get(args[0]), new FindSongs());

然后使用 FindSongs.songPaths 变量作为所有歌曲的列表。 :)

© www.soinside.com 2019 - 2024. All rights reserved.