我尝试在当前应用程序中实现的功能之一是,所选视频的缩略图将显示在ImageView
中。我为此使用http://jcodec.org/。
因为要花很长时间(〜3 s)从视频中抓取图像,所以我想避免冻结UI以便于用户体验,因此使用JavaFX Task
。
这是我目前的方法:
@FXML
public void onAddVideoClick(MouseEvent event) {
final File file = Util.getFileFromFileDialog(
"Video files (*.avi|*.wmv|*.mov|*.mp4)", "*.avi", "*.wmv", "*.mov", "*.mp4"
);
if(file != null) {
final Task<Image> imageGrabberTask = new Task<Image>() {
@Override
public Image call() { return Util.getImageFromVideo(file); }
};
imageGrabberTask.setOnSucceeded(e -> {
Platform.runLater(() -> addVideoView.setImage(imageGrabberTask.getValue()));
});
new Thread(imageGrabberTask).run();
}
}
Util.getImageFromVideo
看起来像这样:
public static Image getImageFromVideo(File file) {
final int frameNumber = 42;
try {
final Picture picture = FrameGrab.getFrameFromFile(file, frameNumber);
final BufferedImage bufferedImage = AWTUtil.toBufferedImage(picture);
return SwingFXUtils.toFXImage(bufferedImage, null);
} catch (IOException | JCodecException e) { e.printStackTrace(); return null;}
}
这仍然冻结了我的UI,但我不知道为什么?有什么想法吗?