info sur une vidéo

info sur une vidéo - C - Programmation

Marsh Posté le 05-07-2007 à 23:44:48    

Bonjour
 
je cherche à récupérer des informations sur une vidéo, à savoir la durée, le bit rate et les dimensions. ( toute ces infos sont disponible d'un clic droit->propriété sur une vidéo)
 
Je voudrais savoir quelle librairie utiliser.
 
Merci  
 
pS:  je code sous Code Blocks sur Windows XP

Reply

Marsh Posté le 05-07-2007 à 23:44:48   

Reply

Marsh Posté le 06-07-2007 à 07:35:28    

ffmpeg peut-être ?

Reply

Marsh Posté le 06-07-2007 à 07:52:04    

Si t'es sous Windows, Je dirais plutot d'utiliser DirectShow

Reply

Marsh Posté le 06-07-2007 à 12:06:55    

ok je me renseigne sur ffmpeg
 
En fait j'aimerais bien que mon prog soit portable donc j'aimerai éviter les librairies spécifiques à un OS

Reply

Marsh Posté le 15-08-2007 à 16:08:22    

Bonjour
 
Après une courte pause, dû à des vacances, je reviens avec une idée qu'un de mes amis m'a donné :
Les informations que je cherche se trouve très certainement dans le header du fichier.  
 
Je suis rentré tout content et j'ai décidé de tester cette idée, mais je n'arrive pas à trouver les infos que je cherche.
 
En effet lorsque que j'ouvre le fichier, et que j'essaye de parcourir son contenu, je ne trouve que des informations abérantes(caractère bizarre,suite de de lettre sans aucun sens,...).
Je pense que ceci viens de ma manière d'ouvrir mon fichier et/ou de la manière de lire les données.

Reply

Marsh Posté le 15-08-2007 à 16:16:27    

une video c'est un fichier binaire
coment ouvre tu le fichier ?


---------------
Blog photo/récits activités en montagne http://planetcaravan.net
Reply

Marsh Posté le 15-08-2007 à 16:25:15    

C'est quoi comme format ta video? Et c'est quoi le type de fichier?

Reply

Marsh Posté le 15-08-2007 à 19:00:49    

Digaboy a écrit :

En effet lorsque que j'ouvre le fichier, et que j'essaye de parcourir son contenu, je ne trouve que des informations abérantes(caractère bizarre,suite de de lettre sans aucun sens,...).
Je pense que ceci viens de ma manière d'ouvrir mon fichier et/ou de la manière de lire les données.


Bah les informations sont organisées et codées selon une spécification bien précise qu'il faut absolument connaitre.  
 
Ceci peut aider :  
 
www.wotsit.org


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 15-08-2007 à 23:21:11    

Donc le format que j'essaye de lire est avi mais je veux pouvoir lire des infos sur d'autre type de fichier mais une chose à la fois.
 
Emmanuel Delahaye : je n'ai trouver aucune information sur l'entête d'un fichier avi, mais j'ai peut être mal regardé
 
Voici mon code

Code :
  1. int main()
  2. {
  3.     FILE * test;
  4.     int i=0;
  5.     test = fopen("azer.avi","rb" );
  6.     for( i=0;i<220;i++)
  7.     {
  8.         printf("position %ld \t ",ftell(test));
  9.         printf("val : %d \n",fgetc(test));
  10.     }
  11. fclose(test);
  12. return 0;
  13. }


 
et voici le résultat dans la console

Code :
  1. position 0       val : 82
  2. position 1       val : 73
  3. position 2       val : 70
  4. position 3       val : 70
  5. position 4       val : 126
  6. position 5       val : 97
  7. position 6       val : 160
  8. position 7       val : 9
  9. position 8       val : 65
  10. position 9       val : 86
  11. position 10      val : 73
  12. position 11      val : 32
  13. position 12      val : 76
  14. position 13      val : 73
  15. position 14      val : 83
  16. position 15      val : 84
  17. position 16      val : 126
  18. position 17      val : 34
  19. position 18      val : 0
  20. position 19      val : 0
  21. position 20      val : 104
  22. position 21      val : 100
  23. position 22      val : 114
  24. position 23      val : 108
  25. position 24      val : 97
  26. position 25      val : 118
  27. position 26      val : 105
  28. position 27      val : 104
  29. position 28      val : 56
  30. position 29      val : 0
  31. position 30      val : 0
  32. position 31      val : 0
  33. position 32      val : 236
  34. position 33      val : 162
  35. position 34      val : 0
  36. .
  37. .// je raccourcis un peu le résultat
  38. .
  39. position 210     val : 0
  40. position 211     val : 0
  41. position 212     val : 74
  42. position 213     val : 85
  43. position 214     val : 78
  44. position 215     val : 75
  45. position 216     val : 24
  46. position 217     val : 16
  47. position 218     val : 0
  48. position 219     val : 0
  49. Press ENTER to continue.


Reply

Marsh Posté le 16-08-2007 à 01:24:27    

J'ai déjà parcouru cette page mais je n'ai rien trouvé de pertinent  

Reply

Marsh Posté le 16-08-2007 à 01:24:27   

Reply

Marsh Posté le 16-08-2007 à 07:17:42    

Digaboy a écrit :


et voici le résultat dans la console

Code :
  1. position 0       val : 82
  2. position 1       val : 73
  3. position 2       val : 70
  4. position 3       val : 70
  5. .....
  6. position 215     val : 75
  7. position 216     val : 24
  8. position 217     val : 16
  9. position 218     val : 0
  10. position 219     val : 0
  11. Press ENTER to continue.




 
Ote-moi d'un doute, tu t'attendais a voir quoi?
 
http://www.fastgraph.com/help/avi_header_format.html
 
devrait t'aider un peu plus
 

Reply

Marsh Posté le 16-08-2007 à 09:29:13    

Digaboy a écrit :

Voici mon code


Pas terrible...

Code :
  1. #include <stdio.h>
  2. #include <ctype.h>
  3. #define fname "azer.avi"
  4. int main (void)
  5. {
  6.    FILE *test = fopen (fname, "rb" );
  7.    if (test != NULL)
  8.    {
  9.       int i;
  10.       for (i = 0; i < 220; i++)
  11.       {
  12.          int c = fgetc (test);
  13.          printf ("%5d %02X %3d", i, c, c);
  14.          if (isprint (c))
  15.          {
  16.             printf (" '%c'", c);
  17.          }
  18.          printf ("\n" );
  19.       }
  20.       fclose (test);
  21.    }
  22.    else
  23.    {
  24.       perror (fname);
  25.    }
  26.    return 0;
  27. }


Les valeurs lues sont des valeurs binaire traduites en décimal, hexa et caractère quand c'est possible. Elles n'ont de sens que si on connait précisément la structure du fichier et la signification des données.


Message édité par Emmanuel Delahaye le 16-08-2007 à 09:38:27

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 16-08-2007 à 09:51:58    

Je ne peut que te conseiller ceci  :love:  
 
http://mediainfo.sourceforge.net/fr
 

Reply

Marsh Posté le 10-09-2007 à 23:24:39    

Merci beaucoup Ace17 grâce à ton lien  j'ai réussi à extraire toutes les infos qu'il me fallait.
 
La fonction permettant de calculer le temps de la vidéo:

Code :
  1. float temps_video(FILE * test)
  2. {
  3.     int valeur[56];
  4.     unsigned int val_time[4];
  5.     unsigned int val_frame[4];
  6.     unsigned int final_time=0, final_frame=0; //temps entre 2 images et nombre d'image
  7.     int i=0;
  8.     float time=0;
  9.     if (test != NULL)
  10.     {
  11.         //on ignore les 32 premiers bits
  12.         for(i=0;i<32;i++)
  13.             fgetc(test);
  14.         //on sauvegarde les 56 bits suivants
  15.         for (i = 0; i < 56; i++)
  16.             valeur[i] = fgetc (test);
  17.         for(i=0;i<4;i++)
  18.         {
  19.             //sauvegarde avec décalage
  20.             val_time[i]= valeur[i] * ((256*i ==0) ? 1 : 256*i);
  21.             final_time += val_time[i];
  22.             val_frame[i]=valeur[16+i] * ((256*i ==0) ? 1 : 256*i);
  23.             final_frame += val_frame[i];
  24.         }
  25.         //durée en microsecondes
  26.         time = final_frame*final_time;
  27.     }
  28.     else
  29.         perror ("probleme" );
  30.     // on divise par 1.000.000 puis par 60 pour passer en minutes
  31.     return time/60000000;
  32. }


 
par contre je me demandais à quoi correspond le paramètre "number of preview frame" situé sur les bits 20-21-22-23


Message édité par Digaboy le 10-09-2007 à 23:56:26
Reply

Marsh Posté le 28-09-2007 à 00:44:13    

Avec l'aide de quelques personnes j'ai amélioré la fonction
Pour ceux que ça interesse:

 
Code :
  1. float temps_video(FILE * test,char* ext)
  2. {
  3.     long int final_time=0, final_frame=0;
  4.     float time=0;
  5.     if (test != NULL && strcmp(ext,"avi" )==0)
  6.     {
  7.         //on ignore les 32 premiers octets
  8.         fseek(test,32,SEEK_SET);
  9.         //on sauvegarde l'intervalle entre 2 images
  10.         fread(&final_time,4,1,test);
  11.         //on ignore les 12 octets suivants
  12.         fseek(test, 12, SEEK_CUR);
  13.         //on sauvegarde le nombre d'image
  14.         fread(&final_frame,4,1,test);
  15.         //durée en microsecondes
  16.         time = final_frame*final_time;
  17.     }
  18.     else
  19.         perror("probleme" );
  20.     // on divise par 1.000.000 puis par 60 pour passer en minutes
  21.     return time/60000000;
  22. }
 

Je redemande, si quelqu'un connait la structure d'un autre type de fichier, qu'il me fasse signe.

 

[EDIT] correction des fautes de langages.


Message édité par Digaboy le 28-09-2007 à 10:00:42
Reply

Marsh Posté le 28-09-2007 à 08:40:39    

fseek prend des octets en paramètre, pas des bits. Tes commentaires sont faux.

Reply

Marsh Posté le 28-09-2007 à 08:59:20    

et on parle de soucre pas de script :o

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed