Olá?
Queria um Player de Vídeo MP4 em Java para Windows, MacOS e Linux?
Alguém tem um código?
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.");
}