caprica / vlcj

Java framework for the vlc media player
http://www.capricasoftware.co.uk/projects/vlcj
1.1k stars 260 forks source link

Unable to play video with vlcj on Eclipse for Java with MacOS Sonoma 14.1.2 #1208

Closed zeynepaydin1 closed 5 months ago

zeynepaydin1 commented 6 months ago

Hey everyone, I am working on a Maven Project in Eclipse and we are using vlcj for the frame animations. The UI part of the project was developed on a Windows computer. However, even though there are no Java part errors on my MacBook Pro with M2 chip, the video cannot be displayed and I get a grey screen. Here is the console when I try to run the frame:

Screenshot 2023-12-22 at 11 05 49 PM

Also, here is my code:

package ui.swing.screens.screencomponents;

import java.awt.BorderLayout;
import java.awt.Canvas;
import java.awt.Dimension;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JFrame;
import javax.swing.JLayeredPane;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

import com.formdev.flatlaf.util.UIScale;

import ui.swing.screens.LoginOverlay;
import uk.co.caprica.vlcj.factory.MediaPlayerFactory;
import uk.co.caprica.vlcj.player.base.MediaPlayer;
import uk.co.caprica.vlcj.player.base.MediaPlayerEventAdapter;
import uk.co.caprica.vlcj.player.embedded.EmbeddedMediaPlayer;

public class LoginBackground extends JPanel {

    private MediaPlayerFactory factory;
    private EmbeddedMediaPlayer mediaPlayer;

    private LoginOverlay loginOverlay;

    public LoginBackground() {
        init();
    }

    private void init() {

        MediaPlayerFactory factory = new MediaPlayerFactory();

        factory = new MediaPlayerFactory();
        mediaPlayer = factory.mediaPlayers().newEmbeddedMediaPlayer();
        Canvas canvas = new Canvas();
        mediaPlayer.videoSurface().set(factory.videoSurfaces().newVideoSurface(canvas));

        mediaPlayer.events().addMediaPlayerEventListener(new MediaPlayerEventAdapter() {
            @Override
            public void timeChanged(MediaPlayer mediaPlayer, long newTime) {
                if (newTime >= mediaPlayer.status().length() - 1000) {
                    mediaPlayer.controls().setPosition(0);
                }
            }
        });

        setLayout(new BorderLayout());

        add(canvas);

    }

    public void initOverlay(JFrame frame) {

        loginOverlay = new LoginOverlay(frame);
        mediaPlayer.overlay().set(loginOverlay);
        mediaPlayer.overlay().enable(true);

    }

    public void play() {

        if(mediaPlayer.status().isPlaying()) {
            mediaPlayer.controls().stop();

        }

        mediaPlayer.media().play("src/ui/swing/resources/animations/video 3.mp4");

    }

    public void stop() {
        mediaPlayer.controls().stop();
        mediaPlayer.release();
    }

}

I am using VLC Version 3.0.20 Vetinari (Apple Silicon), vlcj 4.8.2, jdk 21.0.1, Eclipse IDE for Java Developers Version: 2023-03 (4.27.0), MacOS Sonoma 14.1.2.

I am a beginner Java developer so feel free to suggest anything to me. I did a lot of research but couldn't solve the problem for days. I really appreciate any help you can provide.

caprica commented 6 months ago

See for example https://github.com/search?q=repo%3Acaprica%2Fvlcj+macos+heavyweight&type=issues.

Essentially, contemporary versions of the JDK on macOS do not have a heavyweight AWT toolkit which means you can't use a "normal" media player. So unless you can on a JDK 1.6 JVM, yes 1.6(!), then you can't use the normal video rendering.

You have to use a software rendering media player instead.

In earlier versions of vlcj this is the "direct rendering" media players, in most recent versions of vlcj this requires using a callback video surface, or JavaFX with a custom video surface, with the embedded media player.