如何使用Java自动化视频快照?
以下是我的尝试。不幸的是,搜索命令似乎不起作用,因为无论视频在哪里,[100,100]处像素的颜色仍然保持不变。
我需要的是一个可以创建视频快照的应用程序(最好不需要GUI)。
import javafx.application.Application;
import javafx.fxml.FXML;
import javafx.scene.SnapshotParameters;
import javafx.scene.image.WritableImage;
import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;
import javafx.scene.media.MediaView;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
import javafx.util.Duration;
public class VideoController extends Application {
private MediaPlayer media;
int posun = 100; // milisecs
int pocatek = 0; // milisecs
Duration cas = new Duration(0);
@Override
public void start(Stage scene) throws Exception {
String uri = "http://download.oracle.com/otndocs/products/javafx/arth_512.flv";
final Media medium = new Media(uri);
media = new MediaPlayer(medium);
final MediaView video = new MediaView(media);
// videoPane.getChildren().add(video);
media.setOnReady(new Runnable() {
@Override
public void run() {
media.play();
for (int i = pocatek; i < (int) medium.getDuration().toMillis(); i += posun) {
System.out.println(i);
cas = new Duration(i);
media.seek(cas);
WritableImage wi = new WritableImage(1000, 1000);
video.snapshot(new SnapshotParameters(), wi);
Color c = wi.getPixelReader().getColor(100, 100);
System.out.println(c);
// video.snapshot(params, image);
}
}
});
}
public static void main(String[] args) {
launch();
}
}
输出:
0
0xffffffff
...
640000
0xffffffff
...
670000
0xffffffff
答案 0 :(得分:1)
我不认为这是可能的。 FX媒体API面向播放而非数据操作,如果屏幕上没有实际媒体,则无法轻松加载图片数据。
鉴于您不想要UI,FX没有实际工作,您可能希望通过其他工具解决您的任务,例如: ffmpeg
,请参阅ffmpeg to get screenshot
答案 1 :(得分:0)
不建议将JAVAFX用于此任务。更好的解决方案是使用XUGGLER。本教程中描述了具体情况:
http://www.javacodegeeks.com/2011/02/xuggler-tutorial-frames-capture-video.html
答案 2 :(得分:0)
创建mediaView:新的MediaView(mediaplayer)
使用当前时间属性并添加一个更改监听器**:每次更改播放时间时,都会调用该监听器
在此侦听器内部,我们将为mediaView拍摄快照。
示例
player.currentTimeProperty().addListener(new ChangeListener<Duration>() {
@Override
public void changed(ObservableValue<? extends Duration> arg0, Duration arg1, Duration arg2) {
// TODO Auto-generated method stub
WritableImage write = new WritableImage(media.getWidth(),media.getHeight());
mview.snapshot(new SnapshotParameters(),write);
//Now Write is Your current image
}
});