Video all'interno di un app desktop

di il
13 risposte

Video all'interno di un app desktop

Vorrei inserire in un app desktop un player video interno che visualizza i miei video...è complicato farlo?

13 Risposte

  • Re: Video all'interno di un app desktop

    Ho trovato un codice e l'ho implementato, solo che adesso non appena vado ad esportare il progetto il video nn lo vede e rimane lo schermo nero, invece in locale va tutto bene, non capisco perchè cavolo ..vi posto i codici se riuscite a darmi una spiegazione grazie e se pure a voi fa cosi!

    /////classe main
    package VideoVLCJ;
    import uk.co.caprica.vlcj.discovery.NativeDiscovery;
    import uk.co.caprica.vlcj.runtime.RuntimeUtil;
    import com.sun.jna.NativeLibrary;

    public class main {
    private static String cheminvlc = "C:/Program Files/VideoLAN/VLC";

    public static void main(String[] args) {
    new NativeDiscovery().discover();
    NativeLibrary.addSearchPath
    (RuntimeUtil.getLibVlcLibraryName(),cheminvlc);
    System.setProperty("jna.library.path",cheminvlc);
    finestra f = new finestra();
    }
    }

    ///////////classe2
    package VideoVLCJ;
    import java.awt.BorderLayout;
    import javax.swing.JPanel;
    import uk.co.caprica.vlcj.component.EmbeddedMediaPlayerComponent;

    public class lettura extends JPanel {
    private EmbeddedMediaPlayerComponent mediaPlayer;
    private String cheminVideo = "src/videoVLCJ/Parco.wmv";
    final static int vol=120;
    public lettura() {
    mediaPlayer = new EmbeddedMediaPlayerComponent();
    this.setLayout(new BorderLayout());
    this.add(mediaPlayer,BorderLayout.CENTER);
    }

    public void play(){
    mediaPlayer.getMediaPlayer().playMedia(cheminVideo);

    }

    public void pausa(){
    mediaPlayer.getMediaPlayer().pause();

    }

    public void stop(){
    mediaPlayer.getMediaPlayer().stop();

    }

    public void ricomincia(){
    mediaPlayer.getMediaPlayer().start();
    }

    }

    ///classe 3
    package VideoVLCJ;

    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;

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

    public class finestra extends JFrame {

    private JPanel main = new JPanel();
    private lettura media = new lettura();
    private final JButton btnGenerale = new JButton("Play");
    private final JButton btnP = new JButton("Pausa");

    public finestra() {
    setTitle("eee");
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setSize(500,500);
    setVisible(true);
    setContentPane(main);
    main.setLayout(null);
    main.add(media);
    media.setBounds(0, 0,500, 300);
    btnGenerale.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
    if(btnGenerale.getText().equals("Play")){
    media.play();
    btnGenerale.setText("Stop");
    return;
    }
    media.stop();
    btnGenerale.setText("Play");

    }
    });
    btnGenerale.setBounds(10, 353, 89, 23);

    main.add(btnGenerale);
    btnP.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
    if(btnP.getText().equals("Pausa")){
    media.pausa();
    btnP.setText("Play");
    return;
    }
    media.pausa();
    btnP.setText("Pausa");

    }
    });
    btnP.setBounds(109, 353, 106, 23);
    main.add(btnP);

    }
    }


    bisogna importare queste librerie e vlc istallato
    https://code.google.com/p/vlcj/downloads/detail?name=vlcj-2.4.1-dist.zip&can=2&q=
  • Re: Video all'interno di un app desktop

    eleinad852 ha scritto:


    vorrei inserire in un app desktop un player video interno che visualizza i miei video...è complicato farlo?
    Innanzitutto esiste una API "standard" per la gestione ad alto livello di audio/video, la Java Media Framework (JMF). E trovi tantissime risorse e articoli a riguardo (es. questo).

    eleinad852 ha scritto:


    ho trovato un codice e l'ho implementato, solo che adesso non appena vado ad esportare il progetto il video nn lo vede e rimane lo schermo nero
    Non conosco quella libreria ma ... vedo che usa la JNA. Hai considerato che è necessario mettere diversi jar in classpath? Come fai il build? Hai usato Maven? Insomma, come hai gestito le "dipendenze" necessarie?
  • Re: Video all'interno di un app desktop

    Poi me la vedo jmf, cmq Si ho importato piu jar di quel pacchetto, e nn mi da nessun warning, il build path lo faccio sul progetto: add external jar ecc poi importo le tre librerie necessarie. Poi export e java runnable file, la solita procedura...il file video c'è come risorsa mn capisco
  • Re: Video all'interno di un app desktop

    eleinad852 ha scritto:


    il build path lo faccio sul progetto: add external jar ecc poi importo le tre librerie necessarie. Poi export e java runnable file, la solita procedura...il file video c'è come risorsa mn capisco
    Hai verificato il jar che crei della tua applicazione? In particolare ovviamente il suo "manifest" e l'attributo Class-Path.

    Perché il punto è che se hai fatto "add external jar", hai tirato dentro dei jar da un path "assoluto". Eclipse non ha sicuramente problemi a mettere in classpath quei jar quando avvii da dentro Eclipse.
    Ma nel jar che generi, i jar dipendenti dovrebbero essere legati al jar principale tramite un URL (nel senso che deve usare / ... non \ ) "relativi". Sia per semplicità, sia perché è più logico e comodo e slega da path assoluti che possono valere solo sulla tua macchina.

    Ma se hai tirato in ballo path assoluti, non credo che Eclipse riesca a generare correttamente l'attributo Class-Path del manifest (non ne sono sicuro al 100% ... dovrei verificare). E se anche andasse a mettere i path completi, avresti un jar con path assoluti "cablati" nel jar ... decisamente pessimo.
  • Re: Video all'interno di un app desktop

    Ehmm dove lo trovo il file manifest? cmq ho provato anke a aggiungere tutti i jar da window/preference/buildpath e poi nel progetto aggiungere la libreria ma è lo stesso...dovrei aggiungere su class-path il file jar delle librerie?
  • Re: Video all'interno di un app desktop

    eleinad852 ha scritto:


    ehmm dove lo trovo il file manifest? cmq ho provato anke a aggiungere tutti i jar da window/preference/buildpath e poi nel progetto aggiungere la libreria ma è lo stesso...dovrei aggiungere su class-path il file jar delle librerie?
    Innanzitutto verifica il manifest (è il file META-INF/MANIFEST.MF dentro il jar).

    Poi dimmi una cosa: nel wizard del Runnable JAR File Export cosa specifichi come "Library handling"? (ci sono 3 opzioni possibili).
    Le tre opzioni sono tutte valide tecnicamente, nel senso che ognuna si porta dietro i jar dipendenti o direttamente le classi dai jar dipendenti, in maniera differente (e per certi versi in modo un po' discutibile).
    Anche se hai tirato dentro nel progetto i jar tramite path assoluti, queste 3 opzioni dovrebbero fare in modo che il tuo jar referenzi in maniera corretta (ma ripeto, in modo forse discutibile) le dipendenze che servono.

    Altre possibilità oltre al Export -> Runnable JAR file, ovviamente ce ne sono, che vanno dall'uso di altri plugin in Eclipse per l'export fino all'uso di tool di build come Ant o Maven.
  • Re: Video all'interno di un app desktop

    Le ho provate tutte e 3 le opzioni ma nulla...
    il manifest.mf è cosi:

    Manifest-Version: 1.0
    Class-Path: .
    Main-Class: video.main

    poi cè una cartella 'maven' con dentro un xml e un file properties, sto impazzendo ma xkè come posso fare?
  • Re: Video all'interno di un app desktop

    eleinad852 ha scritto:


    le ho provate tutte e 3 le opzioni ma nulla...
    il manifest.mf è cosi:

    Manifest-Version: 1.0
    Class-Path: .
    Main-Class: video.main
    Innanzitutto se hai ottenuto questo manifest con la prima opzione ("Extract required libraries into generated JAR"), è normale che il Class-Path sia ".". Perché questa opzione fa una cosa abbastanza semplice (anche se discutibile sotto certi aspetti): prende il contenuto di tutti i jar dipendenti e lo mette dentro il jar della tua applicazione. Ovvero, non ci sono più altri jar dipendenti.

    Il problema è un altro, ho rivisto meglio ora il tuo codice iniziale. Non avevo prestato troppa attenzione al tuo codice anche perché non conosco la libreria che hai usato.

    Hai fatto:
    private String cheminVideo = "src/videoVLCJ/Parco.wmv";
    
    ....
    
    mediaPlayer.getMediaPlayer().playMedia(cheminVideo);
    Per cominciare, c'è un concetto che vale in generale: quando la tua applicazione "vive" per conto suo, fuori da un qualunque ambiente/progetto di sviluppo, la "src" (o in qualunque altro modo possa chiamarsi) non esiste e non c'entra più. Non c'entra più il concetto di cartella dei sorgenti!

    Poi comunque quel percorso è sul file-system. Il fatto che il video l'hai messo sotto src vuol dire che Eclipse, al build, "ribalta" tutte le risorse non .java nella cartella dei binari. E alla fin fine vuol dire che il tuo Parco.wmv andrà a finire dentro il jar insieme alle classi.

    Avendo specificato un percorso sul file-system, la tua applicazione, così come è, non è in grado di referenziare il video dentro il jar.
    Ora: è possibile fare in modo, con un codice leggermente diverso, di sfruttare il concetto di "risorsa" che può essere tanto in un jar quanto "sfusa" nel file-system.
    Le risorse si possono leggere ottenendo un apposito URL o InputStream. Quindi innanzitutto devi documentarti su quella libreria che stai usando per verificare se esiste ad esempio un playMedia(URL) o playMedia(InputStream). Se sì, allora puoi sfruttare il concetto delle risorse e referenziare il video dentro il jar. Altrimenti il video deve stare "fuori" dal tuo jar e devi ragionare tu su quale path (relativo, ovviamente) usare per far funzionare il video.
  • Re: Video all'interno di un app desktop

    Si ho messo adesso direttamente il percorso a:
    mediaPlayer.getMediaPlayer().playMedia("risorse/parco.wmv");
    l'ho messo fuori dal src ma se lo esporto nemmeno la cartella risorse mi mette nel jar
  • Re: Video all'interno di un app desktop

    eleinad852 ha scritto:


    mediaPlayer.getMediaPlayer().playMedia("risorse/parco.wmv");
    Questo di per sé è tecnicamente corretto, è la specifica di un file sul file-system e oltretutto è relativa alla directory corrente.
    Significa che per funzionare correttamente bisogna fare in modo che quando si avvia la tua applicazione, la directory corrente è quella che contiene la directory "risorse".
  • Re: Video all'interno di un app desktop

    Ovvero? a me in nessun tipo di esportazione la cartella risorse nn me la mette proprio....che strano
  • Re: Video all'interno di un app desktop

    eleinad852 ha scritto:


    ovvero? a me in nessun tipo di esportazione la cartella risorse nn me la mette proprio....che strano
    Usando playMedia("risorse/parco.wmv"), la directory "risorse" deve per forza stare fuori dal jar. Dove .... dipende, perché come ho detto prima è relativa alla directory "corrente" (verifica sulla documentazione di quel playMedia se ci sono cavilli o problemi riguardo path assoluti vs relativi).

    Se ho ben capito, quella libreria che usi (ripeto: non la conosco) permette di "incorporare" VLC in una applicazione Java. Il "motore" di riproduzione dei video è quindi comunque il codice nativo di VLC, pertanto mi viene da pensare che non sia in grado di trattare le "risorse" (es. dentro jar) come possibile in Java.

    Eclipse comunque in tutto questo non ti aiuta, nel senso che non ti mette alcuna cartella "risorse" vicino a dove esporta il jar! Essendo una risorsa esterna, Eclipse non ne "sa" nulla di come la vuoi trattare tu. Devi assicurarti tu che chi avvierà la applicazione (tu o altri) lo faccia facendo in modo che la directory corrente sia appropriata e contenga una "risorse".

    Tutto qui.
  • Re: Video all'interno di un app desktop

    Ho risolto mettendolo come risorsa esterna ma con il percorso con i doppi slash ("C:\\windows\\...") altrimenti non andava comunque, è proprio strano è la prima volta che mi capita una cosa del genere!
Devi accedere o registrarti per scrivere nel forum
13 risposte