1

如何使用 Java 自动化视频快照?

下面是我的尝试。不幸的是,seek 命令似乎不起作用,因为无论视频在哪里,[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
4

3 回答 3

1

我不认为这是可能的。FX 媒体 API 面向播放而不是数据操作,如果没有屏幕上的实际媒体,您将无法轻松加载图片数据。

鉴于您不想要 UI,FX 没有实际工作,您可能希望通过其他工具解决您的任务,例如ffmpeg,请参阅ffmpeg 以获取屏幕截图

于 2012-12-03T21:22:27.243 回答
0

不建议将 JAVAFX 用于此任务。更好的解决方案是使用 XUGGLER。本教程中描述了确切的情况:

http://www.javacodegeeks.com/2011/02/xuggler-tutorial-frames-capture-video.html

于 2012-12-25T21:14:17.760 回答
0
  1. 创建一个 mediaView : new 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 
    
        }
    });
    
于 2020-10-12T20:08:43.127 回答