Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - ricavare width/height di un video (o sue proporzioni) usando LIBVLC
Forum - C/C++ - ricavare width/height di un video (o sue proporzioni) usando LIBVLC

Avatar
cosimo patrucci (Normal User)
Newbie


Messaggi: 6
Iscritto: 30/09/2015

Segnala al moderatore
Postato alle 20:32
Martedì, 13/10/2015
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:

Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. #include <stdint.h>
  3. #include <GL/glut.h>
  4. #include <math.h>
  5. #include <stdlib.h>
  6. #include <iostream>
  7. #include <assert.h>
  8. #include "vlc/vlc.h"
  9.  
  10. #ifdef linux
  11.     #include <pthread.h>
  12.     #define MUTEX pthread_mutex_t
  13. #elif _WIN32
  14.     #include <windows.h>
  15.     #include <process.h>
  16.     #define MUTEX HANDLE
  17. #endif
  18.  
  19. #define WIDTH 640
  20. #define HEIGHT 480
  21.  
  22. #define W 320
  23. #define H 240
  24.  
  25. int done=1;
  26. GLuint _img=0;
  27. libvlc_instance_t *libvlc;
  28. libvlc_media_t *m;
  29. libvlc_media_player_t *mp;
  30.  
  31. int MUTEX_INIT(MUTEX *mutex)
  32. {
  33.     #ifdef linux
  34.         return pthread_mutex_init (mutex, NULL);;
  35.     #elif _WIN32
  36.         *mutex = CreateMutex(0, FALSE, 0);;
  37.         return (*mutex==0);
  38.     #endif
  39.     return -1;
  40. }
  41.  
  42. int MUTEX_LOCK(MUTEX *mutex)
  43. {
  44.         //if(mutex!=0)
  45.         //{
  46.     #ifdef linux
  47.         return pthread_mutex_lock( mutex );
  48.     #elif _WIN32
  49.                 if(WaitForSingleObject(*mutex,INFINITE)==WAIT_FAILED){return 1;}else{return 0;}
  50.                 //if(WaitForMultipleObjects(1,mutex,0,INFINITE)==WAIT_FAILED){return 1;}else{return 0;}
  51.     #endif
  52.         //}
  53.     return -1;
  54. }
  55.  
  56. int MUTEX_UNLOCK(MUTEX *mutex)
  57. {
  58.         //if(mutex!=0)
  59.         //{
  60.     #ifdef linux
  61.         return pthread_mutex_unlock( mutex );
  62.     #elif _WIN32
  63.         return (ReleaseMutex(*mutex)==0);
  64.     #endif
  65.         //}
  66.     return -1;
  67. }
  68.  
  69. struct ctx
  70. {
  71.     char *pixeldata;
  72.     MUTEX mutex;
  73. }ctx;
  74.  
  75. void reshape(int w, int h)
  76. {
  77.     glViewport(0,0,(GLsizei)w,(GLsizei)h);
  78.     glMatrixMode(GL_PROJECTION);
  79.     glLoadIdentity();
  80.     gluPerspective(40,(GLfloat)w/(GLfloat)h,1,2000);
  81.     glMatrixMode(GL_MODELVIEW);
  82. }
  83.  
  84. static void *lock(void *data, void **p_pixels)
  85. {
  86.     struct ctx *ctx = (struct ctx*)data;
  87.     //MUTEX_LOCK(&ctx->mutex);
  88.     *p_pixels = ctx->pixeldata;
  89.     return NULL;
  90. }
  91.  
  92. static void unlock(void *data, void *id, void *const *p_pixels)
  93. {
  94.     struct ctx *ctx = (struct ctx*)data;
  95.     unsigned int *pixels = (unsigned int*)*p_pixels;
  96.     //MUTEX_UNLOCK(&ctx->mutex);
  97.     assert(id == NULL);
  98. }
  99.  
  100. static void display(void *data, void *id)
  101. {
  102.     struct ctx *ctx = (struct ctx*)data;
  103.     assert(id == NULL);
  104.     std::cout<<libvlc_video_get_width(mp)<<" "<<libvlc_video_get_height(mp)<<"\n";
  105. }
  106.  
  107. void draw(void)
  108. {
  109.         glClearColor(.5f,.5f,.5f,1.0f);
  110.         glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  111.         glLoadIdentity();
  112.         gluLookAt(0,-50,0, 0,0,0, 0,0,1);
  113.         glPushMatrix();
  114.         glRotatef((GLfloat)30,0,0,1);
  115.         glColor3f(1,1,1);
  116.         glBindTexture(GL_TEXTURE_2D,_img);glEnable(GL_TEXTURE_2D);
  117.         //MUTEX_LOCK(&ctx.mutex);
  118.         glBindTexture(GL_TEXTURE_2D,_img);gluBuild2DMipmaps(GL_TEXTURE_2D,GL_RGB,160,120,GL_BGR_EXT,GL_UNSIGNED_BYTE,ctx.pixeldata);
  119.         //MUTEX_UNLOCK(&ctx.mutex);
  120.         glBegin(GL_QUADS);
  121.         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);
  122.         glEnd();
  123.         glPopMatrix();
  124.         glutSwapBuffers();glutPostRedisplay();
  125. }
  126.  
  127. void key(unsigned char key, int x, int y)
  128. {
  129.         switch(key)
  130.         {
  131.                 case 'q':
  132.                         done=0;
  133.                         libvlc_media_player_stop(mp);
  134.                         libvlc_media_player_release(mp);
  135.                         libvlc_release(libvlc);
  136.                 break;
  137.                 default:
  138.                 break;
  139.         }
  140. }
  141.  
  142. int main(int argc, char *argv[])
  143. {
  144.     char *filename="prova.mov";
  145.     char const *vlc_argv[] = {};
  146.     int vlc_argc = sizeof(vlc_argv) / sizeof(*vlc_argv);
  147.     glutInit(&argc,argv);
  148.     glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);
  149.     glutInitWindowSize(640,480);
  150.     glutInitWindowPosition(100,100);
  151.     glutCreateWindow("ch");
  152.     glutDisplayFunc(draw);
  153.     glutReshapeFunc(reshape);
  154.     glutKeyboardFunc(key);
  155.     _img++;glGenTextures(1,&_img);
  156.     MUTEX_INIT(&ctx.mutex);
  157.     ctx.pixeldata=(char*)malloc(sizeof(char)*(160*120*3));
  158.     libvlc = libvlc_new(vlc_argc,vlc_argv);
  159.     if(NULL == libvlc) {printf("LibVLC initialization failure.\n");return EXIT_FAILURE;}
  160.     m = libvlc_media_new_path(libvlc,filename);
  161.     mp = libvlc_media_player_new_from_media(m);
  162.     libvlc_media_release(m);
  163.     libvlc_video_set_callbacks(mp, lock, unlock, display, &ctx.pixeldata);
  164.     libvlc_video_set_format(mp, "RV24", 160, 120, 160*3);
  165.     libvlc_media_player_play(mp);
  166.     glutMainLoop();
  167.     return 0;
  168. }



bisogna linkare le seguenti librerie:
glut, GLU, GL, vlc

Grazie in anticipo.

PM Quote