begin process at 2012 05 30 15:09:40
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Divers

 > 

Général

 > 

Récupération des octets d'un flux MPEG


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Récupération des octets d'un flux MPEG

lundi 10 mars 2008 à 12:01:29 | Récupération des octets d'un flux MPEG

dayvid75014

Bonjour à tous,

J'aimerais demander à l'utilisateur de rentrer dans la console le chemin d'un fichier vidéo et après je voudrais récupérer ce flux MPEG afin d'en tirer des informations (informations que je visualise très bien dans un éditeur hexadécimal). Quelqu'un sait-il comment coder le "bout" qui récupère ce qu'à rentrer l'utilisateur et qui ouvre sous forme héxa pour venir scruter les octets de synchro 0x47 du flux MPEG.

Code : C -
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <conio.h>         // Bibliothèques utiles
  4. #include <string.h>
  5. #include <io.h>
  6. #include <fcntl.h>
  7.  
  8.  
  9. void find_TransportStream_synchro_bytes(void);
  10. //void display_usage(void);
  11. void press_key(char press_key_text[]);             // Liste provisoire des prototypes de nos fonctions
  12. void exit_prog(char error_msg[]);                  //   --> à mettre dans le fichier header
  13. unsignedint menu(void);
  14. long get_ip_file_length (char *ip_filepath);
  15. void file_seek(int offset);
  16. void option_menu1();
  17. void option_menu2();
  18.  
  19.  
  20. struct TransportStream_header                  
  21. {
  22. unsignedchar synchro_byte;
  23. unsignedchar transport_error_ind;
  24. unsignedchar payload_start_indicator;
  25. unsignedchar transport_priority;            // Structure  de l'en-tête TS d'un flux MPEG
  26. unsignedint PID;
  27. unsignedchar transport_scrambling_control;
  28. unsignedchar adaptation_field_control;
  29. unsignedchar continuity_counter;
  30. } TransportStream_header;
  31.  
  32.  
  33. FILE *ip_file = NULL;                      // déclaration et initialisation d'un pointeur de type FILE
  34.  
  35.  
  36. char *ip_filepath;            // Pointeur sur les arguments de la ligne de commande
  37. int synchro_bytes[10];    // Stockage des octets de synchro
  38. unsignedchar TransportStream_raw_header[4]; //4 octets réservés pour la lecture des données du flux
  39. long ip_file_length;   // Longueur du fichier
  40. char choix_menu;
  41.  
  42.  
  43. //=============================================Fonction Principale=================================
  44. int main (int argc, int *argv[])  
  45.  
  46. {
  47.  
  48. char path[200];
  49. FILE *ip_file = NULL;                                        
  50. printf("Tapez ici un chemin valide d'une video MPEG-2 :\n");
  51. scanf ("%s", path);
  52. ip_file = fopen(path, "rb");
  53.  
  54. //if (argc==1)             // Si rien n'est donné en paramètre, on quitte l'appli
  55. //{  
  56. //      exit_prog("");    
  57. //}
  58.  
  59. //while (argc>1)          
  60. //{
  61.  
  62. //ip_file = fopen("C:\\Documents and Settings\\dgombert\\Bureau\\videotest.mpg", "rb");
  63.  
  64. //}
  65.  
  66. //Récupération de la longueur en octets
  67. ip_file_length = get_ip_file_length(ip_filepath);
  68.  
  69. printf("Ouverture du fichier MPEG %s contenant %d octets. \n", ip_filepath,ip_file_length);
  70.  
  71. //Lecture seule, en mode binaire
  72. ip_file = fopen(ip_filepath, "rb");
  73.  
  74. // Trouve les octets de synchro
  75. find_TransportStream_synchro_bytes();
  76.  
  77. // Retourne se placer au premier octet de synchro
  78. fseek(ip_file, synchro_bytes[1], 0);
  79.  
  80. // Affichage du Menu
  81. choix_menu = menu();
  82.       switch(choix_menu)
  83.           {
  84.                 case'1':
  85.         option_menu1();
  86.                 break;
  87.                 case'2':
  88.     option_menu2();
  89.                 break;
  90.                 case'3':
  91.     exit_prog("");
  92.                 break;
  93.                 default:
  94.         puts("\nERREUR : Ceci n'est pas une entrée correcte");
  95.           }
  96.  
  97. exit_prog("");
  98.  
  99. return0;
  100.  
  101. }
  102.  
  103. //===================================================================================================
  104.  
  105. void find_TransportStream_synchro_bytes(void)
  106. {
  107.    int synchro_data = 0;
  108.    long nbre_synchro_data = 0;
  109.    int position_file = 0;
  110.  
  111.    while(!feof(ip_file) && nbre_synchro_data<100)  // utilisation de feof pour trouver les éventuelles erreurs de fread
  112.    {
  113.             position_file = ftell(ip_file);         // Repère la position où nous sommes dans le fichier
  114.                 synchro_data = 0;                       // Pour pouvoir récomparer avec la valeur 0x47...
  115.             fread(&synchro_data,1,1,ip_file);       // Lit octet par octet ip_file et enregistre l'octet dans synchro_data  
  116.             switch(synchro_data)
  117.                 {
  118.                  case 0x47 :
  119.                                 synchro_bytes[nbre_synchro_data] = position_file; // Stockage du nouvel octet de synchro trouvé
  120.                                 nbre_synchro_data++;  // On incrémente jusqu'à 100...
  121.                                 file_seek(187);      // Aller chercher, 187 octets plus loin, le nouvel octet de synchronisation
  122.                         break;
  123.  
  124.                  default :
  125.                                 nbre_synchro_data = 0;
  126.  
  127.                 }
  128.    }
  129.    if(nbre_synchro_data<100)
  130.    {
  131.  
  132.    exit_prog("Erreur : Fin du fichier atteinte avant d'avoir trouvé les 100 octets de synchronisation");
  133.    
  134.    }
  135. }
  136.  
  137. //=================================================================================================
  138.  
  139. //void display_usage(void)
  140. //{
  141. //      puts("Usage:\t TSDECODE -i<input filepath> of TS file to decode");
  142. //      puts("\t \t  -p<search PID>");
  143. //      puts("\t \t  -q do not show progress when extracting");
  144. //
  145. //      puts("\nExample: TSDECODE -ic:\\test.mpg -p600");
  146. //      puts("\t will open file c:\\videotest.mpg and process PID x packets\n");
  147.  
  148. //}
  149.  
  150. //=================================================================================================
  151.  
  152. void press_key(char press_key_text[])
  153. {       
  154.         printf("%s", press_key_text);            
  155.         while( !_kbhit())
  156.         {;}
  157.         _getch();
  158. }
  159.  
  160. //================================================================================================
  161.  
  162. void exit_prog(char error_msg[])
  163. {
  164.         printf("\n%s\n", error_msg);          
  165.         _fcloseall();
  166.         press_key("Press a key to exit...");
  167.         exit(0);
  168. }  
  169.  
  170. //===============================================================================================
  171.  
  172. unsignedint menu(void)
  173. {       
  174.         puts("Menu:");
  175.     puts("1 - Decodage de l'en-tête");
  176.         puts("2 - Extraire le PES");        // Menu à développer avec de nouvelles options
  177.         puts("3 - Exit");
  178.  
  179.         puts("\nEntrer_choix:");
  180.         scanf("%s", &choix_menu);
  181.  
  182.         return  choix_menu;
  183. }
  184.  
  185. //=================================================================================================
  186.  
  187. long get_ip_file_length (char *ip_filepath)
  188. {
  189. int ip_file_bis = 0;
  190. ip_file_bis = _open(ip_filepath,_O_RDONLY);
  191.    
  192.   if(ip_file_bis == -1)
  193.         {
  194.             exit_prog("Erreur : Impossible d'ouvrir le fichier specifie");
  195.         }
  196.  
  197. ip_file_length = _filelength(ip_file_bis);
  198. _close(ip_file_bis);
  199. return ip_file_length;
  200. }
  201.  
  202. //================================================================================================
  203.  
  204. void file_seek(int offset)
  205. {
  206.      if(ftell(ip_file) + offset > ip_file_length)
  207.          {
  208.          press_key("Fin du fichier");
  209.          }
  210.  
  211. fseek(ip_file, offset, 1);
  212.  
  213. }
  214.  
  215. //===============================================================================================
  216.  
  217. void option_menu1()
  218. {
  219.  
  220. TS_decode();
  221.  
  222.  
  223. }
  224.  
  225. //==============================================================================================
  226.  
  227.  
  228. void option_menu2()
  229. {
  230.  
  231.  
  232. }


Mais pendant l'execution, il me dit "impossible d'ouvrir le fichier spécifié" :colere2:
le pointeur est nul, donc ce n'est pas un chemin valide. Je lui donne ça en argument : "C:\Documents and Settings\dgombert\Bureau\videotest.mpg". C'est pourtant un chemin valide nan? :euh: (je fais glisser le fichier vidéo se trouvant sur mon bureau, direct dans la console).

Voici le message de debug :

Loaded 'ntdll.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\kernel32.dll', no matching symbolic information found.
The thread 0xB9C has exited with code 0 (0x0).
The program 'C:\Documents and Settings\dgombert\Bureau\DecodageMpeg\Debug\Decodage_TS.exe' has exited with code 0 (0x0).

Je n'y arrive pas :colere2: , si quelqu'un pouvait m'aider s'il vous plait.. ^^

Bonne journée à tous !
lundi 10 mars 2008 à 14:43:31 | Re : Récupération des octets d'un flux MPEG

Neo_Fr

Membre Club
Salut, C'est pas conseiller de lire un fichier octet par octet, ca nuit gravement au performances.. Essaye ce code normalement ca devrait marcher.. DWORD __stdcall GetSynchroneBytes(LPSTR lpszFile, LPDWORD lpdwTable, DWORD dwElem) { HANDLE hFile; DWORD br, i = 0, tbr = 0, dwRet = 0; BYTE* Buffer; hFile = CreateFile(lpszFile, GENERIC_READ, 0, 0, OPEN_EXISTING, 0, 0); if(hFile == INVALID_HANDLE_VALUE) return 0; Buffer = (BYTE*) HeapAlloc(GetProcessHeap(), HEAP_NO_SERIALIZE, 0x100000);//1 mo if(!Buffer) goto _End; while(1) { if(!ReadFile(hFile, Buffer, 0x100000, &br, 0)) goto _End; if(!br) break; while(1) { if(Buffer[i] == 0x47) { lpdwTable[dwRet] = (tbr+i); if(dwRet++ == dwElem) goto _End; } if(i++ == br) break; } tbr += br; } _End: if(Buffer) HeapFree(GetProcessHeap(), HEAP_NO_SERIALIZE, Buffer); if(hFile) CloseHandle(hFile); return dwRet; } char szFilePath[MAX_PATH+4]; DWORD dwSynchroneBytes[32]; DWORD i, dwRet; int main(int argc, int *argv[]) { if(argc < 2) return 0; strcpy(szFilePath, argv[1]); printf("%s\r\n", szFilePath); dwRet = GetSynchroneBytes(szFilePath, dwSynchroneBytes, 32); for(i=0; i!=dwRet; i++) printf("%i\r\n", dwSynchroneBytes[i]); system("PAUSE"); return 0; } Neo_Fr
lundi 10 mars 2008 à 14:53:19 | Re : Récupération des octets d'un flux MPEG

dayvid75014

Oui mais en fait je fais exprès de lire octets par octets (même si ça nuit aux performances) car je veux récupérer des infos sur les bits des flux MPEG ... notamment les time-stamps DTS et PTS...
lundi 10 mars 2008 à 14:56:11 | Re : Récupération des octets d'un flux MPEG

dayvid75014

en plus ton code se compile avec 15 erreurs...
lundi 10 mars 2008 à 14:58:10 | Re : Récupération des octets d'un flux MPEG

Neo_Fr

Membre Club
ta bien ajouter #include ? Neo_Fr
lundi 10 mars 2008 à 15:00:11 | Re : Récupération des octets d'un flux MPEG

dayvid75014

oui j'ai bien mis l'include windows
mais :

C:\Documents and Settings\dgombert\Bureau\Text1.cpp(12) : error C2143: syntax error : missing ';' before '__stdcall'
C:\Documents and Settings\dgombert\Bureau\Text1.cpp(12) : error C2377: 'DWORD' : redefinition; typedef cannot be overloaded with any other symbol
        c:\program files\microsoft visual studio\vc98\include\windef.h(141) : see declaration of 'DWORD'
C:\Documents and Settings\dgombert\Bureau\Text1.cpp(12) : error C2061: syntax error : identifier 'DWORD'
C:\Documents and Settings\dgombert\Bureau\Text1.cpp(15) : error C2146: syntax error : missing ';' before identifier 'br'
C:\Documents and Settings\dgombert\Bureau\Text1.cpp(15) : error C2065: 'br' : undeclared identifier
C:\Documents and Settings\dgombert\Bureau\Text1.cpp(15) : error C2065: 'i' : undeclared identifier
C:\Documents and Settings\dgombert\Bureau\Text1.cpp(15) : error C2065: 'tbr' : undeclared identifier
C:\Documents and Settings\dgombert\Bureau\Text1.cpp(15) : error C2065: 'dwRet' : undeclared identifier
C:\Documents and Settings\dgombert\Bureau\Text1.cpp(30) : error C2065: 'dwElem' : undeclared identifier
C:\Documents and Settings\dgombert\Bureau\Text1.cpp(43) : error C2146: syntax error : missing ';' before identifier 'dwSynchroneBytes'
C:\Documents and Settings\dgombert\Bureau\Text1.cpp(43) : error C2501: 'DWORD' : missing storage-class or type specifiers
C:\Documents and Settings\dgombert\Bureau\Text1.cpp(43) : error C2086: 'DWORD' : redefinition
C:\Documents and Settings\dgombert\Bureau\Text1.cpp(43) : fatal error C1004: unexpected end of file found
Error executing cl.exe.

Text1.exe - 13 error(s), 0 warning(s)

lundi 10 mars 2008 à 15:01:34 | Re : Récupération des octets d'un flux MPEG

dayvid75014

ça s'améliore, désormais plus qu'une erreur :

C:\Documents and Settings\dgombert\Bureau\Text1.cpp(49) : error C2664: 'strcpy' : cannot convert parameter 2 from 'int *' to 'const char *'
        Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
Error executing cl.exe.
lundi 10 mars 2008 à 15:01:35 | Re : Récupération des octets d'un flux MPEG

dayvid75014

ça s'améliore, désormais plus qu'une erreur :

C:\Documents and Settings\dgombert\Bureau\Text1.cpp(49) : error C2664: 'strcpy' : cannot convert parameter 2 from 'int *' to 'const char *'
        Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
Error executing cl.exe.
lundi 10 mars 2008 à 15:04:03 | Re : Récupération des octets d'un flux MPEG

Neo_Fr

Membre Club
Remplace la ligne de strcpy par ca: strcpy(szFilePath, (LPCSTR)argv[1]); Neo_Fr
lundi 10 mars 2008 à 15:05:02 | Re : Récupération des octets d'un flux MPEG

dayvid75014

j'essaye, merci !

1 2 3 4

Cette discussion est classée dans : menu, file, ip, void, synchro


Répondre à ce message

Sujets en rapport avec ce message

allegro data file [ par mat74 ] salut a tssa fait un ptit momment que j'essaie d'utiliser les datafile mais sa ne marche pasje creer le data file avec grabber.exeensuite j'enregistre Création d'un menu en langage C [ par kimokim ] Salut les programmeurs!! J'aimerai bien avoir une solution à un problème que j'ai affronté lors de mon évolution dans mon programme en langage C, qui MFC, VC++6, MENU [ par safira ] safiraje dois créer ce menu par exemple:file edit open find exitj'écris:AppendMenu(menu2, MF_STRING, 1, "File");AppendMenu(menu2, MF_STRIN MFC, VC++ 6, MENU [ par safira ] safiraSalut!J'ai un probleme, je dois créer um menu, comme celui-ci:File Edit Open Find Exitmais en utilisant que les fonctions. Je Probleme changement d'adresse Ip dans ma socket [ par kingdom_slayer_666 ] Bonjour, Voila j'aimerais envoyer un packet UDP a diiferentes adresses Réseau (IP). En utilisant Builder 5 j ai créer ma socket dans une classe liée pb prog C: recuperation clavier [ par btita ] bonjour, voila, je vous expose mon prob. je developpe (depuis peu) avec Dev C++ sous Windows XP. je dois faire un projet qui permet de gerer le mat wxListCtrl->Problème de mise à jour pendant l'exécution->Fermeture du programme [ par isohelix ] Bonjour à tous. Je sais ce que vous allez me dire: "la question à déjà été posée". Et j'ai regardé ce qui se rapprochait de près ou de loin à mon prob Readfile et access denied [ par sran_isback ] Bonjour ! J'aimerai récupérer le contenu d'un fichier texte et le coller dans un tableau de char afin de pouvoir l'utiliser dans une autre partie du Fonctions Imbriquées avec argument string [ par Zakata ] Bonjours,J'esaye de programmer deux classes de menu. L'architecture est la suivantes : Une classe Menuclass Menu{public:    Menu(void);    ~Menu(void) Erreur : Access violation [ par dayvid75014 ] Bonjour à tous,Je fais ceci : FILE *ip_file;seek(ip_file, synchro_bytes[1], 0);  //synchro_bytes stocke mon 1er octet de synchro, je me positionne des


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,889 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales