====== Creare un semplice lettore multimediale con libvlc ======
Autore: **//Fabio Di Matteo//** \\ Ultima revisione: **//17/05/2012//** \\ \\
{{programmazione:libvlc:gtk-vlc.png|}}
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 [[http://wiki.videolan.org/Libvlc|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 ( [[programmazione:gtk:creazione_scheletro_per_applicazioni_gtkbuilder]] ) . \\
Dipendenze (debian/ubuntu): libvlccore-dev, libvlc-dev, libgtk2.0-dev, cmake, gcc .
===== Sorgente =====
Di seguito il sorgente abbondantemente commentato.
#include //includo le librerie gtk e glade.
#include //includo le librerie vlc
#include
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**
===== 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''