Foros

Avisos
Vaciar todo

LINUX. Leer ficheros de video y sacarlos por pantalla sin OpenCV


fusion
Respuestas: 391
Socio
Topic starter
(@fusion)
Ardero reputado
Registrado: hace 14 años

Las librerías de OpenCV son muy pesadas, por lo que he buscado otras opciones empleando vlc y wxwidgets lo cual me ha costado un montón, así que pongo aquí los pasos a seguir por si os ocurre trabajar con ello. Lo he instalado sobre debian 8 jessie (el que se suele meter por ahora en la rasberry):

1. Instalar el gtk:
sudo apt-get update
sudo apt-get install libgtk-3-dev

2. Instalar opengl, yo lo hice así y además me metió el freeglut:
apt-get install freeglut3-dev

3. Bajarse de https://www.wxwidgets.org/downloads/ la última versión estable y ponerla en algún sitio (pues en downloads alguno podría borrarlo y liarla parda, por ejemplo en home>programas>wxwidgets-3.0.2
3.1. Crear carpeta ahí dentro que se llama gtk-build y desde el terminal voy a dicha carpeta y hago:

../configure --enable-unicode --enable-debug
make
make install
wx-config --version

La última operación sirve para ver si ha funcionado la instalación
Todas estas operaciones aparecen en esta web: https://wiki.wxwidgets.org/Compiling_and_getting_started

4. Instalar el vlc y librerías dev que no fué fácil de averiguar:

sudo apt-get purge vlc (por si estaba)
sudo apt-get install vlc
sudo apt-get install browser-plugin-vlc
sudo apt-get install libvlccore-dev
sudo apt-get install libvlc-dev

5. Copiar en algun sitio, por ejemplo en home>programas>c++>video1 el siguiente programa pillado de aqui y reparado un poco: http://git.videolan.org/?p=vlc.git;a=blob;f=doc/libvlc/gtk_player.c y asegurarse que el nombre es: gtk_player.c


//gcc -o gtk_player gtk_player.c `pkg-config --libs gtk+-3.0 libvlc` `pkg-config --cflags gtk+-3.0 libvlc`
/* License WTFPL http://sam.zoy.org/wtfpl/ */
/* Written by Vincent Schüßler */

#include <stdlib.h>
#include <gtk/gtk.h>
#include <gdk/gdkx.h>
#include <vlc/vlc.h>

#define BORDER_WIDTH 6

void destroy(GtkWidget *widget, gpointer data);
void player_widget_on_realize(GtkWidget *widget, gpointer data);
void on_open(GtkWidget *widget, gpointer data);
void open_media(const char* uri);
void play(void);
void pause_player(void);
void on_playpause(GtkWidget *widget, gpointer data);
void on_stop(GtkWidget *widget, gpointer data);

libvlc_media_player_t *media_player;
libvlc_instance_t *vlc_inst;
GtkWidget *playpause_button;

void destroy(GtkWidget *widget, gpointer data) {
gtk_main_quit();
}

void player_widget_on_realize(GtkWidget *widget, gpointer data) {
libvlc_media_player_set_xwindow(media_player, GDK_WINDOW_XID(gtk_widget_get_window(widget)));
}

void on_open(GtkWidget *widget, gpointer data) {
GtkWidget *dialog;
dialog = gtk_file_chooser_dialog_new("Choose Media", data, 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) {
char *uri;
uri = gtk_file_chooser_get_uri(GTK_FILE_CHOOSER(dialog));
open_media(uri);
g_free(uri);
}
gtk_widget_destroy(dialog);
}

void open_media(const char* uri) {
libvlc_media_t *media;
media = libvlc_media_new_location(vlc_inst, uri);
libvlc_media_player_set_media(media_player, media);
play();
libvlc_media_release(media);
}

void on_playpause(GtkWidget *widget, gpointer data) {
if(libvlc_media_player_is_playing(media_player) == 1) {
pause_player();
}
else {
play();
}
}

void on_stop(GtkWidget *widget, gpointer data) {
pause_player();
libvlc_media_player_stop(media_player);
}

void play(void) {
libvlc_media_player_play(media_player);
gtk_button_set_label(GTK_BUTTON(playpause_button), "gtk-media-pause");
}

void pause_player(void) {
libvlc_media_player_pause(media_player);
gtk_button_set_label(GTK_BUTTON(playpause_button), "gtk-media-play");
}

int main( int argc, char *argv[] ) {
GtkWidget *window,
*vbox,
*menubar,
*filemenu,
*fileitem,
*filemenu_openitem,
*player_widget,
*hbuttonbox,
*stop_button;

gtk_init (&argc, &argv);
// setup window
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_default_size(GTK_WINDOW(window), 400, 300);
g_signal_connect(window, "destroy", G_CALLBACK(destroy), NULL);
gtk_container_set_border_width (GTK_CONTAINER (window), 0);
gtk_window_set_title(GTK_WINDOW(window), "GTK+ libVLC Demo");

//setup vbox
vbox = gtk_vbox_new(FALSE, 0);
gtk_container_add(GTK_CONTAINER(window), vbox);

//setup menu
menubar = gtk_menu_bar_new();
filemenu = gtk_menu_new();
fileitem = gtk_menu_item_new_with_label ("File");
filemenu_openitem = gtk_menu_item_new_with_label("Open");
gtk_menu_shell_append(GTK_MENU_SHELL(filemenu), filemenu_openitem);
gtk_menu_item_set_submenu(GTK_MENU_ITEM(fileitem), filemenu);
gtk_menu_shell_append(GTK_MENU_BAR(menubar), fileitem);
gtk_box_pack_start(GTK_BOX(vbox), menubar, FALSE, FALSE, 0);
g_signal_connect(filemenu_openitem, "activate", G_CALLBACK(on_open), window);

//setup player widget
player_widget = gtk_drawing_area_new();
gtk_box_pack_start(GTK_BOX(vbox), player_widget, TRUE, TRUE, 0);

//setup controls
//playpause_button = gtk_button_new_from_stock(GTK_STOCK_MEDIA_PLAY);
playpause_button = gtk_button_new_with_label("gtk-media-play");
gtk_button_set_use_stock(GTK_BUTTON(playpause_button), TRUE);
stop_button = gtk_button_new_from_stock(GTK_STOCK_MEDIA_STOP);
g_signal_connect(playpause_button, "clicked", G_CALLBACK(on_playpause), NULL);
g_signal_connect(stop_button, "clicked", G_CALLBACK(on_stop), NULL);
hbuttonbox = gtk_hbutton_box_new();
gtk_container_set_border_width(GTK_CONTAINER(hbuttonbox), BORDER_WIDTH);
gtk_button_box_set_layout(GTK_BUTTON_BOX(hbuttonbox), GTK_BUTTONBOX_START);
gtk_box_pack_start(GTK_BOX(hbuttonbox), playpause_button, FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(hbuttonbox), stop_button, FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(vbox), hbuttonbox, FALSE, FALSE, 0);

//setup vlc
char const *vlc_argv[] = { // "--no-audio", // Don't play audio.
"--no-xlib" // Don't use Xlib. // Apply a video filter. //"--video-filter", "sepia", //"--sepia-intensity=200"
};
int vlc_argc = sizeof(vlc_argv) / sizeof(*vlc_argv);
vlc_inst = libvlc_new(vlc_argc, vlc_argv);
media_player = libvlc_media_player_new(vlc_inst);
g_signal_connect(G_OBJECT(player_widget), "realize", G_CALLBACK(player_widget_on_realize), NULL);

gtk_widget_show_all(window);
gtk_main ();

libvlc_media_player_release(media_player);
libvlc_release(vlc_inst);
return 0;
}

6. Modificarlo a placer y compilarlo empleando:
//gcc -o gtk_player gtk_player.c `pkg-config --libs gtk+-3.0 libvlc` `pkg-config --cflags gtk+-3.0 libvlc`

7. Entonces se arranca el compilado (si no hubiera error) con ./gtk_player se abre en File el fichero de video y ya está.

Responder
1 respuesta
fusion
Respuestas: 391
Socio
Topic starter
(@fusion)
Ardero reputado
Registrado: hace 14 años

El problema que tengo es que me sale un error al quitar el Xlib (lo quité por no tenerlo instalado pues dá problemas)
Ademas no puedo usar los frames, por lo visto para poder extraerlos hay que usar threads

Responder
Compartir: