Player de Vídeo MP4 para Windows, MacOS e Linux em Java

Olá?
Queria um Player de Vídeo MP4 em Java para Windows, MacOS e Linux?
Alguém tem um código?

https://jesuino.gitbooks.io/javafx-pratico/content/artigos/tocando_video.html

Não tem em Javax.Swing?

AWT e Swing não tem suporte nativo para .mp4, vai precisar do Java FX.

Você pode utilizar opencv para ler os frames do video e o image do swing para mostrar os frames.

  • OpenCV
  • BufferedImage
  • JLabel Swing

1 ̣° Adicionar o opencv ao seu proejtos java(O opencv seria adicionado como lib externa)

<dependency>
   <groupId>nu.pattern</groupId>
   <artifactId>opencv</artifactId>
   <version>2.4.9-4</version>
   <scope>compile</scope>
</dependency>

2° carregar a lib

try {
    //System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
    nu.pattern.OpenCV.loadShared(); 
}catch(Exception e){
	System.out.println("Error in load local: " + e.getMessage());
	nu.pattern.OpenCV.loadLocally();
};

3° ler do arquivo com o opencv e Exibir

import org.opencv.core.Mat;
import org.opencv.videoio.VideoCapture;
import javax.swing.*;
import java.awt.image.BufferedImage;
import java.io.IOException;

// ... (método MatToBufferedImage deve estar definido)

public void playVideo(String videoPath) throws IOException {
    // 1. Inicializa o VideoCapture
    VideoCapture capture = new VideoCapture(videoPath);
    Mat frame = new Mat();

    // Verifica se a captura foi aberta com sucesso
    if (!capture.isOpened()) {
        System.err.println("Erro: Não foi possível abrir o arquivo de vídeo: " + videoPath);
        return;
    }

    // 2. Prepara o Swing para exibição (JLabel em um JFrame)
    JLabel videoLabel = new JLabel();
    JFrame frameWindow = new JFrame("OpenCV Video Player");
    frameWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frameWindow.getContentPane().add(videoLabel);
    frameWindow.pack();
    frameWindow.setVisible(true);

    // 3. Loop de Leitura e Exibição
    while (capture.read(frame)) { // Tenta ler o próximo frame
        if (frame.empty()) {
            break; // Sai do loop se não houver mais frames
        }

        // 4. Converte Mat para BufferedImage
        BufferedImage image = MatToBufferedImage(frame);

        // 5. Atualiza o JLabel no Swing (Passo 4° Incompleto)
        videoLabel.setIcon(new ImageIcon(image));
        videoLabel.setSize(image.getWidth(), image.getHeight());
        frameWindow.pack(); // Reajusta o tamanho da janela se o frame mudar

        // Pausa opcional para controlar a taxa de quadros (30ms = ~33 FPS)
        try {
            Thread.sleep(30); 
        } catch (InterruptedException ex) {
            Thread.currentThread().interrupt();
        }
    }

    // 6. Libera os recursos
    capture.release();
    frameWindow.dispose();
    System.out.println("Reprodução de vídeo concluída.");
}