Barra laterale

programmazione:libvlc:creare_un_lettore_multimediale

Creare un semplice lettore multimediale con libvlc

Autore: Fabio Di Matteo
Ultima revisione: 17/05/2012

In questo articolo ci occuperemo di creare un lettore multimediale completo di interfaccia grafica capace di leggere gran parte dei media esistenti. Per l'interfaccia grafica abbiamo scelto le gtk+2 ma avremmo potuto scegliere qualunque altra libreria grafica. Inoltre per la realizzazione del makefile ci appoggeremo al cmake in quanto ci garantira' massima portabilita.
Per chi vuole muovere i primi passi con libvlc puo' visitare il loro Wiki .
Per realizzare lo scheletro dell'applicazione che fa uso di gtk e del suo nativo supporto alle interfacce realizzate con glade utilizzero' il nostro script che automatizza il processo ( Creazione automatica dello scheletro per applicazioni gtkbuilder ) .

Dipendenze (debian/ubuntu): libvlccore-dev, libvlc-dev, libgtk2.0-dev, cmake, gcc .

Sorgente

Di seguito il sorgente abbondantemente commentato.

#include <gtk/gtk.h>                                                //includo le librerie gtk e glade.
#include <vlc/vlc.h> 												//includo le librerie vlc
#include <gdk/gdkx.h>
 
 
GtkBuilder *xml;                                                 //questo è il puntatore al file xml che contiene l'interfaccia  
GtkWidget  *widget;                                              //questa variabile serve per recuperare di volta in volta il  
                                                                //  widget (ovvero l'oggetto ) che vogliamo usare
 
 
 
/*Instanza di libvlc (core)*/
libvlc_instance_t * inst;
 
/*Instanza di libvlc media player*/
libvlc_media_player_t *mp;
 
/*Media (file o url da leggere)*/
libvlc_media_t *m;
 
 
 
void on_MainWindow_delete_event(GtkWidget *widget, gpointer user_data)        //altra callback associata alla chiusura della 
{                                                                         // finestra 
	 gtk_main_quit();
}
 
void on_btStop_clicked(GtkWidget *widget, gpointer user_data)
{
	/* Stop playing */
     libvlc_media_player_stop(mp);
} 
 
void on_btPause_clicked(GtkWidget *widget, gpointer user_data) 
{
	/*Se il lettore sta leggendo qualcosa lo mette in pausa, 
	 * altrimenti lo mette in play*/
	if (libvlc_media_player_is_playing(mp)==1)
	{
		libvlc_media_player_set_pause(mp,1);
	}else{
		libvlc_media_player_play (mp);
	}		
}
void on_btLoad_clicked (GtkWidget *widget, gpointer user_data) 
{
	/*Dialog gtk per caricare il file*/
	GtkWidget *dialog, *MainWindow;
	GtkFileFilter* filter;
	gchar *filename;
 
	MainWindow= GTK_WIDGET (gtk_builder_get_object(xml, "MainWindow"));
 
	dialog = gtk_file_chooser_dialog_new ("Seleziona un file",
						  GTK_WINDOW(MainWindow),
						  GTK_FILE_CHOOSER_ACTION_OPEN,
						  GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
						  GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
						  NULL);
 
 
	if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT)
	{
		filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));
 
		/* Load the VLC engine */
		 inst = libvlc_new (0, NULL);
 
		 /* Create a new item */
		 m = libvlc_media_new_path (inst, (char* )filename);
 
		 /* Create a media player playing environement */
		 mp = libvlc_media_player_new_from_media (m);
 
		 /* No need to keep the media now */
		 libvlc_media_release (m);
 
		 /*Include il mediaplayer dentro un widget gtk (drawing area) */
		 widget= GTK_WIDGET (gtk_builder_get_object(xml, "MediaPlayer"));
		 uint32_t  xwin = GDK_WINDOW_XWINDOW (GTK_WIDGET (widget)->window);
		 libvlc_media_player_set_xwindow(mp,xwin);	
 
		 /* play the media_player */
		 libvlc_media_player_play (mp);
  }
  gtk_widget_destroy (dialog);
  g_free (filename);
 
} 
 
 
 
 
 
int
main (int argc, char *argv[])
{
  	gtk_init (&argc, &argv);
	gchar* base;
	gchar* glade_file;
 
	if (g_find_program_in_path ("gtk-vlc")==NULL){
		/*Ricava il percorso dell'eseguibile, senza il nome del file*/ 
		base = g_path_get_dirname(argv[0]);
 
		/*Concatena il percorso base al nome file gui.glade */
		glade_file = g_build_filename (base,"../share/gtk-vlc", "gui.glade", NULL);
	}else{
		base = g_path_get_dirname(g_find_program_in_path ("gtk-vlc"));
		glade_file = g_build_filename (base,"../share/gtk-vlc", "gui.glade", NULL);
	}	
 
    /*Infine carica come disolito il file dell'interfaccia */
    GError* error = NULL;
	xml = gtk_builder_new ();
	if (!gtk_builder_add_from_file (xml, glade_file, &error))
	  {
		g_warning ("Couldn't load builder file: %s", error->message);
		g_error_free (error);
	  }
 
 
	 /* connette tutti gli eventi dei widget alle rispettive funzioni */
   	 gtk_builder_connect_signals (xml, NULL);
 
 
      	/* Avvia il ciclo principale delle Gtk */ 
	gtk_main ();
 
  return 0;
 
}

Qualora non si abbia un'installazione sul proprio sistema è opportuno specificare la cartella contenente i plugins (=codec e altro) cambiando la dichairazione del libvlc engine come segue:

/*Path for plugin (bin/plugins)*/
const char * const vlc_args[] = { "--plugin-path=./plugins"  };
 
 
/* Load the VLC engine */
inst = libvlc_new (1, vlc_args);

File interfaccia creata con Glade3

gui.glade

<?xml version="1.0" encoding="UTF-8"?>
<interface>
  <requires lib="gtk+" version="2.16"/>
  <!-- interface-naming-policy project-wide -->
  <object class="GtkWindow" id="MainWindow">
    <property name="visible">True</property>
    <signal name="delete_event" handler="on_MainWindow_delete_event"/>
    <child>
      <object class="GtkVBox" id="vbox1">
        <property name="visible">True</property>
        <child>
          <placeholder/>
        </child>
        <child>
          <object class="GtkDrawingArea" id="MediaPlayer">
            <property name="width_request">640</property>
            <property name="height_request">360</property>
            <property name="visible">True</property>
          </object>
          <packing>
            <property name="position">1</property>
          </packing>
        </child>
        <child>
          <object class="GtkHBox" id="hbox1">
            <property name="visible">True</property>
            <child>
              <object class="GtkButton" id="btLoad">
                <property name="label">Carica</property>
                <property name="height_request">30</property>
                <property name="visible">True</property>
                <property name="can_focus">True</property>
                <property name="receives_default">True</property>
                <signal name="clicked" handler="on_btLoad_clicked"/>
              </object>
              <packing>
                <property name="position">0</property>
              </packing>
            </child>
            <child>
              <object class="GtkButton" id="btPause">
                <property name="label">Play/Pausa</property>
                <property name="height_request">30</property>
                <property name="visible">True</property>
                <property name="can_focus">True</property>
                <property name="receives_default">True</property>
                <signal name="clicked" handler="on_btPause_clicked"/>
              </object>
              <packing>
                <property name="position">1</property>
              </packing>
            </child>
            <child>
              <object class="GtkButton" id="btStop">
                <property name="label">Stop</property>
                <property name="height_request">30</property>
                <property name="visible">True</property>
                <property name="can_focus">True</property>
                <property name="receives_default">True</property>
                <signal name="clicked" handler="on_btStop_clicked"/>
              </object>
              <packing>
                <property name="position">2</property>
              </packing>
            </child>
          </object>
          <packing>
            <property name="position">2</property>
          </packing>
        </child>
      </object>
    </child>
  </object>
  <object class="GtkAction" id="action1"/>
</interface>

Il nostro CMakeLists.txt

Il nostro script ha creato un CMakeLists.txt generico per lavorare con le gtk+2 , noi aggiungeremo il supporto alla libreria libvnc .

cmake_minimum_required(VERSION 2.6)
PROJECT(gtk-vlc)
SET (AUTHOR "Fabio Di Matteo" INTERNAL "Author")
SET (VERSION "0.1.0")
INCLUDE (FindPkgConfig)
IF (NOT PKG_CONFIG_FOUND)
	MESSAGE (FATAL_ERROR "pkg-config not found...") 
ENDIF (NOT PKG_CONFIG_FOUND)

pkg_check_modules (GTK REQUIRED gtk+-2.0>=2.6)
pkg_check_modules (LIBVLC REQUIRED libvlc)

IF (NOT GTK_FOUND)
	MESSAGE(FATAL_ERROR "You don't seem to have gtk >= 2.6 development libraries installed...")
ENDIF (NOT GTK_FOUND)

IF (NOT LIBVLC_FOUND)
	MESSAGE(FATAL_ERROR "You don't seem to have libvlc development libraries installed...")
ENDIF (NOT LIBVLC_FOUND)


ADD_DEFINITIONS()
INCLUDE_DIRECTORIES (. ${GTK_INCLUDE_DIRS})


LINK_DIRECTORIES (${GTK_LIBRARY_DIRS})
LINK_LIBRARIES (${GTK_LIBRARIES} )
LINK_LIBRARIES (${LIBVLC_LIBRARIES} )


#Indichiamo dove sara' messo l'eseguibile
ADD_EXECUTABLE( bin/gtk-vlc src/main.c)
#Se se si ha bisogno di eventuali dipendenze fornite da noi stessi
#ADD_DEPENDENCIES (gtk-vlc src/main.c)
#Variabili per le directory di installazione
#ADD_DEFINITIONS (-DVERSION=\"${VERSION}\")
#ADD_DEFINITIONS (-DDATADIR=\"${CMAKE_INSTALL_PREFIX}/share\")
#Copia file per l'installazione
#ADD_SUBDIRECTORY (src)
INSTALL (TARGETS bin/gtk-vlc DESTINATION bin)
INSTALL (DIRECTORY share/gtk-vlc DESTINATION share)

Compilazione e installazione del progetto

Quando vorremo compilare e installare il progetto basteranno i seguenti comandi:

cmake . 
make
sudo make install

oppure

./configure 
make
sudo make install

Qualora si vogliano cambiare le opzioni di configurazione e' sufficente lanciare il comando

ccmake .

se il comando ccmake non e' installato lo si puo' installare in ubuntu con sudo apt-get install cmake-curses-gui


programmazione/libvlc/creare_un_lettore_multimediale.txt · Ultima modifica: 18/04/2018 - 15:48 (modifica esterna)