При использовании Javafx для воспроизведения видео, как я могу сделать, например, «прямоугольник» (Processing lib) перед ним? - PullRequest
1 голос
/ 12 мая 2019

Мое видео воспроизводится очень хорошо, но мне нужно, чтобы перед ним отображались некоторые элементы.

Я использую 'PApplet' в Eclipse (задание колледжа требует, чтобы мы использовали Processing IDE, но мне нужны некоторые функции Java, чтобы она работала так, как я ее представляю), и каждый раз, когда видео начинает воспроизводиться (черезjavafx) он занимает весь экран программы.

Несмотря на то, что я вызываю прямоугольник, например, после того, как я вызываю видео для запуска, он все равно занимает весь экран, и я не вижу этот прямоугольник.

public class UsingProcessing extends PApplet {

   String Dir = System.getProperty("C:\\Users\\Matheus\\eclipse-workspace\\Narraint");
   Stage stage;

   ZonedDateTime now = ZonedDateTime.now();
   LocalDateTime startOfDay = now.toLocalDate().atStartOfDay();
   java.time.Duration d = java.time.Duration.between(startOfDay,now);
   javafx.util.Duration duration = new javafx.util.Duration( d.toMillis());


   public static void main(String[] args) {

      PApplet.main("UsingProcessing");
   }

   public void settings() {

      size(1100, 618,FX2D);
   }

   public void setup() {

      try {

          Field field = PSurfaceFX.class.getDeclaredField("stage");
          field.setAccessible(true);
          stage = (Stage)field.get(surface);

          File f = new File(Dir, "narrativas.mp4");

          Media media = new Media(f.toURI().toURL().toString());
          javafx.scene.media.MediaPlayer player = new javafx.scene.media.MediaPlayer(media);
          MediaView viewer = new MediaView(player);

          DoubleProperty width = viewer.fitWidthProperty();
          DoubleProperty height = viewer.fitHeightProperty();
          width.bind(Bindings.selectDouble(viewer.sceneProperty(), "width"));
          height.bind(Bindings.selectDouble(viewer.sceneProperty(), "height"));
          viewer.setPreserveRatio(true);

          StackPane root = new StackPane();
          root.getChildren().add(viewer);

          Scene scenes = new Scene(root, 1100, 618, Color.TRANSPARENT);
          stage.setScene(scenes);
          stage.setTitle("OBSV.CamFeed.6°07'08.3\"S 12°23'51.5\"E");
          stage.setFullScreen(false);
          stage.show();
          player.setStartTime(duration); 
          player.setCycleCount(MediaPlayer.INDEFINITE);
          player.play();
      } 

      catch(Exception e) {

          e.printStackTrace();
      }
   }

   public void draw() {

      rect(30, 20, 80, 50); //Just for testing, if anything can show up in
                           //front of the video then my problem is solved!
   }
}

1 Ответ

2 голосов
/ 13 мая 2019

Причина, по которой вы не видите прямоугольник, заключается в том, что вы заменяете сцену обработки (которая используется для визуализации «прямоугольника») сценой, содержащей видео.

Имея доступ к холсту, созданному обработкой (который можно получить с помощью переменной stage), вы можете использовать StackPane для размещения холста перед видео:

public void settings() {
    size(300, 300, FX2D);
}

...

StackPane root = new StackPane();
root.getChildren().add(viewer);
Node processingCanvas = stage.getScene().getRoot().getChildrenUnmodifiable().get(0);
root.getChildren().add(processingCanvas);
Scene scenes = new Scene(root, 1100, 618, Color.TRANSPARENT);
stage.setScene(scenes);

ОБНОВЛЕНИЕ

Завершите пример по запросу:

import java.io.File;
import java.lang.reflect.Field;
import java.time.LocalDateTime;
import java.time.ZonedDateTime;

import javafx.beans.binding.Bindings;
import javafx.beans.property.DoubleProperty;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.layout.StackPane;
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;
import processing.core.PApplet;
import processing.javafx.PSurfaceFX;

public class UsingProcessing extends PApplet {

    private static final String VIDEO_FILE_NAME = "teste.mp4";
    private static final String DIRECTORY = "/home/vladwoguer/Downloads/";
    Stage stage;

    ZonedDateTime now = ZonedDateTime.now();
    LocalDateTime startOfDay = now.toLocalDate().atStartOfDay();
    javafx.util.Duration duration = Duration.ZERO;

    public static void main(String[] args) {

        PApplet.main("UsingProcessing");
    }

    public void settings() {
        size(300, 300, FX2D);
    }

    public void setup() {

        try {

            Field field = PSurfaceFX.class.getDeclaredField("stage");
            field.setAccessible(true);
            stage = (Stage) field.get(surface);

            File f = new File(DIRECTORY, VIDEO_FILE_NAME);

            Media media = new Media(f.toURI().toURL().toString());
            javafx.scene.media.MediaPlayer player = new javafx.scene.media.MediaPlayer(media);
            MediaView viewer = new MediaView(player);

            DoubleProperty width = viewer.fitWidthProperty();
            DoubleProperty height = viewer.fitHeightProperty();
            width.bind(Bindings.selectDouble(viewer.sceneProperty(), "width"));
            height.bind(Bindings.selectDouble(viewer.sceneProperty(), "height"));
            viewer.setPreserveRatio(true);

            StackPane root = new StackPane();
            root.getChildren().add(viewer);
            Node processingCanvas = stage.getScene().getRoot().getChildrenUnmodifiable().get(0);

            root.getChildren().add(processingCanvas);
            Scene scenes = new Scene(root, 1100, 618, Color.TRANSPARENT);
            stage.setScene(scenes);
            stage.setTitle("OBSV.CamFeed.6°07'08.3\"S 12°23'51.5\"E");
            stage.setFullScreen(false);
            stage.show();
            player.setStartTime(duration);
            player.setCycleCount(MediaPlayer.INDEFINITE);
            player.play();

        }

        catch (Exception e) {

            e.printStackTrace();
        }
    }

    public void draw() {
        rect(30, 20, 80, 50); // Just for testing, if anything can show up in
    }
}

* ОБНОВЛЕНИЕ * Прозрачный фон

Использование:

public void draw() {

    PImage img;
    img = loadImage(DIRECTORY + "background_1.png");
    background(img);

    rect(50, 50, 150, 150); // Just for testing, if anything can show up in
}

background_1.png должно быть прозрачным png изображением того же размера, что и Scene.

Результат:

Result

Полный код:

import java.io.File;
import java.lang.reflect.Field;
import java.time.LocalDateTime;
import java.time.ZonedDateTime;

import javafx.beans.binding.Bindings;
import javafx.beans.property.DoubleProperty;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.layout.StackPane;
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;
import processing.core.PApplet;
import processing.core.PImage;
import processing.javafx.PSurfaceFX;

public class UsingProcessing extends PApplet {

    private static final String VIDEO_FILE_NAME = "teste.mp4";
    private static final String DIRECTORY = "/home/vladwoguer/Downloads/";
    Stage stage;

    ZonedDateTime now = ZonedDateTime.now();
    LocalDateTime startOfDay = now.toLocalDate().atStartOfDay();
    javafx.util.Duration duration = Duration.ZERO;

    public static void main(String[] args) {

        PApplet.main("UsingProcessing");
    }

    public void settings() {
        size(300, 300, FX2D);
    }

    public void setup() {

        try {

            Field field = PSurfaceFX.class.getDeclaredField("stage");
            field.setAccessible(true);
            stage = (Stage) field.get(surface);

            File f = new File(DIRECTORY, VIDEO_FILE_NAME);

            Media media = new Media(f.toURI().toURL().toString());
            javafx.scene.media.MediaPlayer player = new javafx.scene.media.MediaPlayer(media);
            MediaView viewer = new MediaView(player);

            DoubleProperty width = viewer.fitWidthProperty();
            DoubleProperty height = viewer.fitHeightProperty();
            width.bind(Bindings.selectDouble(viewer.sceneProperty(), "width"));
            height.bind(Bindings.selectDouble(viewer.sceneProperty(), "height"));
            viewer.setPreserveRatio(true);

            StackPane root = new StackPane();
            root.getChildren().add(viewer);
            Node processingCanvas = stage.getScene().getRoot().getChildrenUnmodifiable().get(0);

            root.getChildren().add(processingCanvas);
            Scene scenes = new Scene(root, 300, 300, Color.TRANSPARENT);
            stage.setScene(scenes);
            stage.setTitle("OBSV.CamFeed.6°07'08.3\"S 12°23'51.5\"E");
            stage.setFullScreen(false);
            stage.show();
            player.setStartTime(duration);
            player.setCycleCount(MediaPlayer.INDEFINITE);
            player.play();

        }

        catch (Exception e) {

            e.printStackTrace();
        }
    }

    public void draw() {
        PImage img;
        img = loadImage(DIRECTORY + "background_1.png");
        background(img);
        rect(50, 50, 150, 150); // Just for testing, if anything can show up in
    }
}
...