13/10/15 18:32
cosimo patrucci
Salve a tutti. Sto lavorando con la libreria di vlc per la riproduzione di video (ad es. mov) in un contesto opengl.
Sono riuscito a riprodurre il video in opengl, ma non riesco a ricavare informazioni, quali larghezza/altezza, usando le funzioni della libreria di vlc.
In particolare ho usato funzioni quali:
libvlc_video_get_size,
libvlc_video_get_width,
libvlc_video_get_height
ma senza risultati coerenti.
Vi posto un esempio (C++) che usa libvlc_video_get_width e libvlc_video_get_height:
bisogna linkare le seguenti librerie:
glut, GLU, GL, vlc
Grazie in anticipo.
Sono riuscito a riprodurre il video in opengl, ma non riesco a ricavare informazioni, quali larghezza/altezza, usando le funzioni della libreria di vlc.
In particolare ho usato funzioni quali:
libvlc_video_get_size,
libvlc_video_get_width,
libvlc_video_get_height
ma senza risultati coerenti.
Vi posto un esempio (C++) che usa libvlc_video_get_width e libvlc_video_get_height:
#include <stdio.h> #include <stdint.h> #include <GL/glut.h> #include <math.h> #include <stdlib.h> #include <iostream> #include <assert.h> #include "vlc/vlc.h" #ifdef linux #include <pthread.h> #define MUTEX pthread_mutex_t #elif _WIN32 #include <windows.h> #include <process.h> #define MUTEX HANDLE #endif #define WIDTH 640 #define HEIGHT 480 #define W 320 #define H 240 int done=1; GLuint _img=0; libvlc_instance_t *libvlc; libvlc_media_t *m; libvlc_media_player_t *mp; int MUTEX_INIT(MUTEX *mutex) { #ifdef linux return pthread_mutex_init (mutex, NULL);; #elif _WIN32 *mutex = CreateMutex(0, FALSE, 0);; return (*mutex==0); #endif return -1; } int MUTEX_LOCK(MUTEX *mutex) { //if(mutex!=0) //{ #ifdef linux return pthread_mutex_lock( mutex ); #elif _WIN32 if(WaitForSingleObject(*mutex,INFINITE)==WAIT_FAILED){return 1;}else{return 0;} //if(WaitForMultipleObjects(1,mutex,0,INFINITE)==WAIT_FAILED){return 1;}else{return 0;} #endif //} return -1; } int MUTEX_UNLOCK(MUTEX *mutex) { //if(mutex!=0) //{ #ifdef linux return pthread_mutex_unlock( mutex ); #elif _WIN32 return (ReleaseMutex(*mutex)==0); #endif //} return -1; } struct ctx { char *pixeldata; MUTEX mutex; }ctx; void reshape(int w, int h) { glViewport(0,0,(GLsizei)w,(GLsizei)h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(40,(GLfloat)w/(GLfloat)h,1,2000); glMatrixMode(GL_MODELVIEW); } static void *lock(void *data, void **p_pixels) { struct ctx *ctx = (struct ctx*)data; //MUTEX_LOCK(&ctx->mutex); *p_pixels = ctx->pixeldata; return NULL; } static void unlock(void *data, void *id, void *const *p_pixels) { struct ctx *ctx = (struct ctx*)data; unsigned int *pixels = (unsigned int*)*p_pixels; //MUTEX_UNLOCK(&ctx->mutex); assert(id == NULL); } static void display(void *data, void *id) { struct ctx *ctx = (struct ctx*)data; assert(id == NULL); std::cout<<libvlc_video_get_width(mp)<<" "<<libvlc_video_get_height(mp)<<"\n"; } void draw(void) { glClearColor(.5f,.5f,.5f,1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); gluLookAt(0,-50,0, 0,0,0, 0,0,1); glPushMatrix(); glRotatef((GLfloat)30,0,0,1); glColor3f(1,1,1); glBindTexture(GL_TEXTURE_2D,_img);glEnable(GL_TEXTURE_2D); //MUTEX_LOCK(&ctx.mutex); glBindTexture(GL_TEXTURE_2D,_img);gluBuild2DMipmaps(GL_TEXTURE_2D,GL_RGB,160,120,GL_BGR_EXT,GL_UNSIGNED_BYTE,ctx.pixeldata); //MUTEX_UNLOCK(&ctx.mutex); glBegin(GL_QUADS); glTexCoord2i(0,1);glVertex3f(-10,0,-10);glTexCoord2i(1,1);glVertex3i(10,0,-10);glTexCoord2i(1,0);glVertex3i(10,0,10);glTexCoord2i(0,0);glVertex3f(-10,0,10); glEnd(); glPopMatrix(); glutSwapBuffers();glutPostRedisplay(); } void key(unsigned char key, int x, int y) { switch(key) { case 'q': done=0; libvlc_media_player_stop(mp); libvlc_media_player_release(mp); libvlc_release(libvlc); break; default: break; } } int main(int argc, char *argv[]) { char *filename="prova.mov"; char const *vlc_argv[] = {}; int vlc_argc = sizeof(vlc_argv) / sizeof(*vlc_argv); glutInit(&argc,argv); glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB); glutInitWindowSize(640,480); glutInitWindowPosition(100,100); glutCreateWindow("ch"); glutDisplayFunc(draw); glutReshapeFunc(reshape); glutKeyboardFunc(key); _img++;glGenTextures(1,&_img); MUTEX_INIT(&ctx.mutex); ctx.pixeldata=(char*)malloc(sizeof(char)*(160*120*3)); libvlc = libvlc_new(vlc_argc,vlc_argv); if(NULL == libvlc) {printf("LibVLC initialization failure.\n");return EXIT_FAILURE;} m = libvlc_media_new_path(libvlc,filename); mp = libvlc_media_player_new_from_media(m); libvlc_media_release(m); libvlc_video_set_callbacks(mp, lock, unlock, display, &ctx.pixeldata); libvlc_video_set_format(mp, "RV24", 160, 120, 160*3); libvlc_media_player_play(mp); glutMainLoop(); return 0; }
bisogna linkare le seguenti librerie:
glut, GLU, GL, vlc
Grazie in anticipo.
aaa