Vlcj e video in un pannello o altro componente che non sia un frame

di il
16 risposte

Vlcj e video in un pannello o altro componente che non sia un frame

Ragazzi ho un problema con le librerie vlcj ..in pratica vorrei mostrare il video nella parte superiore di un frame , mentre nella parte inferiore vorrei gestire altri componenti grafici quali pulsanti, caselle di testo e altro..
questo è il codice :
import java.awt.BorderLayout;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Window;

import javax.swing.JFrame;
import javax.swing.JPanel;

import com.sun.jna.Native;
import com.sun.jna.NativeLibrary;

import uk.co.caprica.vlcj.binding.LibVlc;
import uk.co.caprica.vlcj.player.MediaPlayerFactory;
import uk.co.caprica.vlcj.player.embedded.EmbeddedMediaPlayer;
import uk.co.caprica.vlcj.player.embedded.windows.Win32FullScreenStrategy;
import uk.co.caprica.vlcj.runtime.RuntimeUtil;

public class MediaPlayer {

		public MediaPlayer(String nameFile, Window w){
			Canvas c= new Canvas();
			c.setBackground(Color.black);
			w.add(c);
		
			NativeLibrary.addSearchPath(RuntimeUtil.getLibVlcLibraryName(),"lib");
			Native.loadLibrary(RuntimeUtil.getLibVlcLibraryName(), LibVlc.class);
	
		
		
		
	
			MediaPlayerFactory mpf= new MediaPlayerFactory();
		
		
			EmbeddedMediaPlayer emp= mpf.newEmbeddedMediaPlayer(new Win32FullScreenStrategy(w));
			emp.setVideoSurface(mpf.newVideoSurface(c));
		
			
		
		
			emp.setEnableMouseInputHandling(false);
		
		
			emp.setEnableKeyInputHandling(false);
		
		
			emp.prepareMedia(nameFile);
			emp.play();
		
		
		
		}
		
	}

questo è il main:

import java.awt.Frame;
import java.awt.HeadlessException;
import java.awt.Window;

import javax.swing.JFrame;

public class TestProvePlayer {
	 public static void main(String[] args) {
	Window w = new Window(new Frame());
	MediaPlayer mp= new MediaPlayer("Movie.mp4", w);
}
}
cosa sto sbagliando? come potrei risolvere?

16 Risposte

  • Re: Vlcj e video in un pannello o altro componente che non sia un frame

    gaab ha scritto:


    vorrei mostrare il video nella parte superiore di un frame , mentre nella parte inferiore vorrei gestire altri componenti grafici quali pulsanti, caselle di testo e altro..
    java.awt.Window ha per default un BorderLayout. Facendo:

    w.add(c);

    hai aggiunto il canvas nell'area CENTER, che occupa quindi tutto lo spazio disponibile che non è eventualmente occupato da altre aree. Quindi potresti mettere nell'area SOUTH un pannello con altri componenti. Tieni presente che in NORTH/SOUTH viene rispettato solo il "preferred height" del componente inserito in una di queste aree.


    P.S. Window w = new Window(new Frame());
    non è sbagliato ma è inutile.

    Potresti passare null (= nessun owner). Ma è chiaro che se fai:

    new Window(null)

    hai un errore di compilazione, perché ci sono 2 costruttori applicabili: Window(Frame) e Window(Window). Semplicemente basta un cast per scegliere uno dei due:

    new Window((Window) null)
  • Re: Vlcj e video in un pannello o altro componente che non sia un frame

    
    Exception in thread "main" java.lang.IllegalStateException: The video surface component must be displayable
    	at uk.co.caprica.vlcj.player.embedded.videosurface.CanvasVideoSurface.attach(CanvasVideoSurface.java:82)
    	at uk.co.caprica.vlcj.player.embedded.DefaultEmbeddedMediaPlayer.attachVideoSurface(DefaultEmbeddedMediaPlayer.java:162)
    	at uk.co.caprica.vlcj.player.embedded.DefaultEmbeddedMediaPlayer.onBeforePlay(DefaultEmbeddedMediaPlayer.java:327)
    	at uk.co.caprica.vlcj.player.DefaultMediaPlayer.play(DefaultMediaPlayer.java:804)
    	at MediaPlayer.<init>(MediaPlayer.java:48)
    	at TestProvePlayer.main(TestProvePlayer.java:10)
    ho questo errore
  • Re: Vlcj e video in un pannello o altro componente che non sia un frame

    gaab ha scritto:


    The video surface component must be displayable
    Il concetto di "displayable" è descritto nella documentazione javadoc di .

    Un componente diventa displayable quando sulla finestra top-level viene fatto tipicamente un pack() o un setVisible(). Detto in altro modo (e pur non conoscendo vlcj nei dettagli), dovresti provare ad invocare il play() solo dopo aver invocato setVisible(true), che dovresti comunque fare e che invece non vedo nel tuo codice precedente.
  • Re: Vlcj e video in un pannello o altro componente che non sia un frame

    import java.awt.BorderLayout;
    import java.awt.Frame;
    import java.awt.HeadlessException;
    import java.awt.Window;
    
    import javax.swing.JFrame;
    
    public class TestProvePlayer {
    	 public static void main(String[] args) {
    	
    	Window w = new Window((Window)null);
    	
    	w.setVisible(true);
    	MediaPlayer mp= new MediaPlayer("Movie.mp4", w);
    }
    }
    così facendo il video parte senza generare eccezioni, ma non mi mostra nulla a display ..riesco solo a sentire l'audio e per chiuderlo devo terminare il processo da gestione risorse
  • Re: Vlcj e video in un pannello o altro componente che non sia un frame

    gaab ha scritto:


    così facendo il video parte senza generare eccezioni, ma non mi mostra nulla a display ..riesco solo a sentire l'audio e per chiuderlo devo terminare il processo da gestione risorse
    Ascolta: il setVisible(true) generalmente/tipicamente è l'ultima cosa da fare DOPO aver creato e composto tutta la user interface di una finestra. Tu invece l'hai fatto PRIMA ancora di aver creato i componenti, ecc..!

    No, setVisible(true) in questo caso va fatto per (quasi) ultimo, mettendo poi solamente DOPO il play().
  • Re: Vlcj e video in un pannello o altro componente che non sia un frame

    Ho provato a fare come mi hai appena detto ma mi riporta alla stessa eccezione precedente ... ho provato a far partire la classe test commentando l'istruzione MediaPlayer mp= new MediaPlayer("Movie.mp4", w); e lasciando il setVisible( true); ma a display non vedo nulla
    scusa la mia ignoranza, ma sto cercando di imparare.. vorrei capire se bisogna includere il componente Window all'interno di un altro contenitore per poterlo visualizzare..
  • Re: Vlcj e video in un pannello o altro componente che non sia un frame

    gaab ha scritto:


    ho provato a fare come mi hai appena detto ma mi riporta alla stessa eccezione precedente ... ho provato a far partire la classe test commentando l'istruzione MediaPlayer mp= new MediaPlayer("Movie.mp4", w); e lasciando il setVisible( true); ma a display non vedo nulla
    scusa la mia ignoranza, ma sto cercando di imparare.. vorrei capire se bisogna includere il componente Window all'interno di un altro contenitore per poterlo visualizzare..
    Esattamente partendo dal tuo codice postato inizialmente, nel costruttore:
    ..........
             emp.prepareMedia(nameFile);
             w.setVisible(true);
             emp.play();
    
  • Re: Vlcj e video in un pannello o altro componente che non sia un frame

    Ancora nulla... non riesco a visualizzare nulla a video, solo audio
  • Re: Vlcj e video in un pannello o altro componente che non sia un frame

    Nessuna risposta?
  • Re: Vlcj e video in un pannello o altro componente che non sia un frame

    Nessuna soluzione??? Io vorrei inserire in un pannello il video ma appena provo a farlo mi genera un'eccezione oppure parte solo l'audio e una finestra vuota.. aiutooooo
  • Re: Vlcj e video in un pannello o altro componente che non sia un frame

    gaab ha scritto:


    Io vorrei inserire in un pannello il video ma appena provo a farlo mi genera un'eccezione oppure parte solo l'audio e una finestra vuota.. aiutooooo
    Se ti riferisci alla "IllegalStateException: The video surface component must be displayable" ... beh, mi pare di averlo chiarito prima e bene. Se è altro, precisa il problema. Il Canvas per la superficie da usare la puoi mettere dove vuoi, in un pannello, in una area specifica di un layout, ecc..
  • Re: Vlcj e video in un pannello o altro componente che non sia un frame

    Non funziona.. ho provato a farlo con un pannello con un oggetto di tipo window come ti ho mostrato prima... se lo faccio con un panello non parte neanche l'audio , mentre se lo faccio in un componente window mi esce un "pezzo di interfaccia" bianca e parte solo l'audio
  • Re: Vlcj e video in un pannello o altro componente che non sia un frame

    Se ti può essere utile, ho appena fatto un mio esempio qui: simple-player-with-play.

    È minimale ma funzionante, sebbene non sono ancora sicurissimo su alcuni aspetti di vlcj.
  • Re: Vlcj e video in un pannello o altro componente che non sia un frame

    @gaab: riguardo i tuoi problemi a cui accennavi, sto pensando che un problema è sicuramente dovuto alla raggiungibilità dell'oggetto EmbeddedMediaPlayer.

    La documentazione javadoc ufficiale di vlcj della classe MediaPlayerFactory dice chiaramente:

    You must make sure you keep a hard reference to the media player (and possibly other) objects created by this factory. If you allow a media player object to go out of scope, then unpredictable behaviour will occur (such as events no longer seeming to fire) even though the video playback continues (since that happens via native code). You may also likely suffer fatal JVM crashes.

    Nel tuo codice iniziale si vede che il EmbeddedMediaPlayer lo assegni ad una variabile 'emp' che però è locale al costruttore, quindi terminato il costruttore, essa sparisce.
Devi accedere o registrarti per scrivere nel forum
16 risposte