Hey guys,
after trying godzillions of video-playback approaches, I returned to give JavaFX a try. There have been a few recent updates on tutorials and indeed, there is one working (still have to prove it for Mac and Linux through). My problem is that I want to display the video on a custom component. In my case that component is the UI of Slick2D. Can anyone hint me if there is a simple way to either paint the video on any graphics context or just create a frame and then grab it?
The code I made run from the turorial is like that:
public class FxVideoSwingTest {
private static void initAndShowGUI() {
// This method is invoked on Swing thread
JFrame frame = new JFrame("FX");
final JFXPanel fxPanel = new JFXPanel();
frame.add(fxPanel);
frame.setVisible(true);
frame.setSize(800, 600);
Platform.runLater(new Runnable() {
@Override
public void run() {
initFX(fxPanel);
}
});
}
private static final String MEDIA_URL = "file:///eclipse_workspace/JavaFxVideo/head.mp4";
private static void initFX(JFXPanel fxPanel) {
// Create media player
Media media = new Media(MEDIA_URL);
javafx.scene.media.MediaPlayer mediaPlayer = new javafx.scene.media.MediaPlayer(media);
mediaPlayer.setAutoPlay(true);
mediaPlayer.setCycleCount(javafx.scene.media.MediaPlayer.INDEFINITE);
// Print track and metadata information
media.getTracks().addListener(new ListChangeListener<Track>()
{
@Override
public void onChanged(Change<? extends Track> change)
{
System.out.println("Track> " + change.getList());
}
});
media.getMetadata().addListener(new MapChangeListener<String, Object>()
{
@Override
public void onChanged(MapChangeListener.Change<? extends String, ? extends Object> change)
{
System.out.println("Metadata> " + change.getKey() + " -> " + change.getValueAdded());
}
});
// This method is invoked on JavaFX thread
Group root = new Group();
Scene scene = new Scene(root, 800, 600);
MediaView mediaView = new MediaView(mediaPlayer);
root.getChildren().add(mediaView);
fxPanel.setScene(scene);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
initAndShowGUI();
}
});
}
}