116 lines
4.1 KiB
Java
116 lines
4.1 KiB
Java
package kellerkinder.HomeFlix.player;
|
|
|
|
import java.nio.ByteBuffer;
|
|
|
|
import javafx.application.Platform;
|
|
import javafx.scene.Scene;
|
|
import javafx.scene.image.Image;
|
|
import javafx.scene.image.ImageView;
|
|
import javafx.scene.image.PixelBuffer;
|
|
import javafx.scene.image.PixelFormat;
|
|
import javafx.scene.image.WritableImage;
|
|
import javafx.scene.layout.StackPane;
|
|
import javafx.stage.Stage;
|
|
import kellerkinder.HomeFlix.application.Main;
|
|
import uk.co.caprica.vlcj.factory.MediaPlayerFactory;
|
|
import uk.co.caprica.vlcj.player.base.MediaPlayer;
|
|
import uk.co.caprica.vlcj.player.embedded.EmbeddedMediaPlayer;
|
|
import uk.co.caprica.vlcj.player.embedded.videosurface.CallbackVideoSurface;
|
|
import uk.co.caprica.vlcj.player.embedded.videosurface.VideoSurfaceAdapters;
|
|
import uk.co.caprica.vlcj.player.embedded.videosurface.callback.BufferFormat;
|
|
import uk.co.caprica.vlcj.player.embedded.videosurface.callback.BufferFormatCallback;
|
|
import uk.co.caprica.vlcj.player.embedded.videosurface.callback.RenderCallback;
|
|
import uk.co.caprica.vlcj.player.embedded.videosurface.callback.format.RV32BufferFormat;
|
|
|
|
public class NewMediaPlayer {
|
|
|
|
private MediaPlayerFactory mediaPlayerFactory;
|
|
private EmbeddedMediaPlayer embeddedMediaPlayer;
|
|
private WritableImage videoImage;
|
|
private PixelBuffer<ByteBuffer> videoPixelBuffer;
|
|
private ImageView videoImageView;
|
|
|
|
private Stage stage;
|
|
private StackPane pane;
|
|
private Scene scene;
|
|
|
|
public NewMediaPlayer() {
|
|
mediaPlayerFactory = new MediaPlayerFactory();
|
|
embeddedMediaPlayer = mediaPlayerFactory.mediaPlayers().newEmbeddedMediaPlayer();
|
|
embeddedMediaPlayer.videoSurface().set(new FXCallbackVideoSurface());
|
|
}
|
|
|
|
public void init() {
|
|
// Auto-generated method stub
|
|
stage = new Stage();
|
|
pane = new StackPane();
|
|
scene = new Scene(pane);
|
|
|
|
videoImageView = new ImageView();
|
|
videoImageView.setPreserveRatio(true);
|
|
videoImageView.fitWidthProperty().bind(pane.widthProperty());
|
|
videoImageView.fitHeightProperty().bind(pane.heightProperty());
|
|
pane.getChildren().add(videoImageView);
|
|
|
|
stage.setScene(scene);
|
|
stage.setTitle("HomeFlix");
|
|
stage.getIcons().add(new Image(Main.class.getResourceAsStream("/icons/Homeflix_Icon_64x64.png")));
|
|
stage.setOnCloseRequest(event -> {
|
|
//DBController.getInstance().setCurrentTime(streamURL, playerController.getCurrentTime());
|
|
//playerController.getMediaPlayer().stop();
|
|
stop();
|
|
stage.close();
|
|
});
|
|
stage.show();
|
|
}
|
|
|
|
public void play(String streamURL) {
|
|
embeddedMediaPlayer.media().play(streamURL);
|
|
}
|
|
|
|
public void stop() {
|
|
embeddedMediaPlayer.controls().stop();
|
|
embeddedMediaPlayer.release();
|
|
mediaPlayerFactory.release();
|
|
System.out.println("released");
|
|
}
|
|
|
|
private class FXCallbackVideoSurface extends CallbackVideoSurface {
|
|
FXCallbackVideoSurface() {
|
|
super(new FXBufferFormatCallback(), new FXRenderCallback(), true,
|
|
VideoSurfaceAdapters.getVideoSurfaceAdapter());
|
|
}
|
|
}
|
|
|
|
private class FXBufferFormatCallback implements BufferFormatCallback {
|
|
private int sourceWidth;
|
|
private int sourceHeight;
|
|
|
|
@Override
|
|
public BufferFormat getBufferFormat(int sourceWidth, int sourceHeight) {
|
|
this.sourceWidth = sourceWidth;
|
|
this.sourceHeight = sourceHeight;
|
|
return new RV32BufferFormat(sourceWidth, sourceHeight);
|
|
}
|
|
|
|
@Override
|
|
public void allocatedBuffers(ByteBuffer[] buffers) {
|
|
assert buffers[0].capacity() == sourceWidth * sourceHeight * 4;
|
|
PixelFormat<ByteBuffer> pixelFormat = PixelFormat.getByteBgraPreInstance();
|
|
videoPixelBuffer = new PixelBuffer<>(sourceWidth, sourceHeight, buffers[0], pixelFormat);
|
|
videoImage = new WritableImage(videoPixelBuffer);
|
|
videoImageView.setImage(videoImage);
|
|
}
|
|
}
|
|
|
|
private class FXRenderCallback implements RenderCallback {
|
|
@Override
|
|
public void display(MediaPlayer mediaPlayer, ByteBuffer[] nativeBuffers, BufferFormat bufferFormat) {
|
|
Platform.runLater(() -> {
|
|
videoPixelBuffer.updateBuffer(pb -> null);
|
|
});
|
|
}
|
|
}
|
|
|
|
}
|