目前,这就是我检查文件是否可以通过 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));
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
。
虽然我没有测试下面提出的解决方案,主要是因为不了解您最终打算执行的任务的概述。然而,最接近您当前实现以及基本播放指南建议的方法是尝试
Media
实例。MediaException
(如果有)。此外,异常类型
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
(如上面的存根)而不是直接删除它,这可以进一步优化。
试试这个
//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 变量作为所有歌曲的列表。 :)