自动化视频快照

时间:2012-12-03 20:45:55

标签: java javafx-2 video-capture snapshot

如何使用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

3 个答案:

答案 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)

  1. 创建mediaView:新的MediaView(mediaplayer)

  2. 使用当前时间属性并添加一个更改监听器**:每次更改播放时间时,都会调用该监听器

  3. 在此侦听器内部,我们将为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 
    
        }
    });