====== 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** True True 640 360 True 1 True Carica 30 True True True 0 Play/Pausa 30 True True True 1 Stop 30 True True True 2 2 ===== 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''