Skip to content
This repository was archived by the owner on Aug 19, 2020. It is now read-only.

Mediaplayer #1

Open
wants to merge 6 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
68 changes: 0 additions & 68 deletions AppSinkListener.java

This file was deleted.

111 changes: 0 additions & 111 deletions GstRenderer.java

This file was deleted.

25 changes: 0 additions & 25 deletions ImageContainer.java

This file was deleted.

133 changes: 133 additions & 0 deletions mediaplayer/GstMediaPlayer.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,133 @@
package mediaplayer;


import java.net.URI;
import java.util.logging.Logger;

import org.freedesktop.gstreamer.Bus;
import org.freedesktop.gstreamer.Gst;
import org.freedesktop.gstreamer.GstObject;
import org.freedesktop.gstreamer.elements.AppSink;
import org.freedesktop.gstreamer.elements.PlayBin;
import org.freedesktop.gstreamer.fx.FXImageSink;
import org.freedesktop.gstreamer.message.Message;

import javafx.application.Platform;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;

/*
* The main idea is to use FXImageSink and PlayBin to play a media file in this ImageView.
* A main JavaFX Application can simply add this Node to the scene graph and control the media
* in a very basic way (start/stop/repeat)
*/


public class GstMediaPlayer extends ImageView {

private final static Logger LOGGER = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME);

private AppSink videosink;

private PlayBin playbin;

private boolean repeat = false;

public GstMediaPlayer(double x, double y) {
init(null, x, y);
}

public GstMediaPlayer() {
init(null, 0, 0);
}

public GstMediaPlayer(URI video, double x, double y) {
init(video, x, y);
}

public GstMediaPlayer(URI video) {
init(video, 0, 0);
}

private void init (URI video, double x, double y) {

LOGGER.info("Init");

setX(x);
setY(y);

Gst.init("GstMediaPlayer", new String[0]);

videosink = new AppSink("GstVideoComponent");
videosink.set("max-buffers", 5000);
videosink.set("drop", true);

FXImageSink fXImageSink = new FXImageSink(videosink);
fXImageSink.imageProperty().addListener(
imageProperty().bind(fXImageSink.imageProperty());

if (video != null)
playbin = new PlayBin("playbin", video);
else
playbin = new PlayBin("playbin");
playbin.setVideoSink(videosink);

setPreserveRatio(true);

playbin.getBus().connect("element", new Bus.MESSAGE() {
@Override
public void busMessage(Bus arg0, Message arg1) {
LOGGER.info("Bus message: " + arg1.getStructure());
}
});

playbin.getBus().connect(new Bus.EOS() {
@Override
public void endOfStream(GstObject source) {
playbin.stop();
if (repeat) playbin.play();
}
});

}

public void setURI(URI uri) {
playbin.setURI(uri);
}

public void close() {
playbin.close();
}

public void stop() {
repeat = false;
playbin.stop();
LOGGER.fine("stopping/stopped ");
}

public void play() {
playbin.play();
}

public void play(URI uri) {
playbin.stop();
playbin.setURI(uri);
playbin.play();
}

public void playAndRepeat() {
playAndRepeat(null);
}

public void playAndRepeat(URI uri) {
LOGGER.info("playAndRepeat " + uri);
repeat = true;
if (uri != null) {
play(uri);
} else {
playbin.play();
}
}
}
54 changes: 54 additions & 0 deletions mediaplayer/GstPlayVideo.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
package mediaplayer;

import java.nio.file.Paths;


import javafx.application.Application;
import javafx.application.Platform;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
import javafx.stage.StageStyle;

public class GstPlayVideo extends Application {


private Scene scene;

private GstMediaPlayer mpMain;

public static void main(String[] args) {
System.out.println("STart v08:48+ GstPlayVideo");
launch(args);
}

@Override
public void start(Stage primaryStage) throws Exception {

String video = getParameters().getRaw().get(0);
System.out.println("Playing " + Paths.get("", video).toUri());

mpMain = new GstMediaPlayer(Paths.get("", video).toUri());

StackPane ap = new StackPane(mpMain);

scene = new Scene(ap);

scene.addEventHandler(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent event) {
System.out.println("STOP");
Platform.exit();
}
});

primaryStage.setScene(scene);
primaryStage.initStyle(StageStyle.UNDECORATED);
primaryStage.setFullScreen(true);
primaryStage.show();
mpMain.play();
}

}