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

Résolu
dayvid75014 Messages postés 96 Date d'inscription mercredi 5 mars 2008 Statut Membre Dernière intervention 25 avril 2008 - 10 mars 2008 à 12:01
dayvid75014 Messages postés 96 Date d'inscription mercredi 5 mars 2008 Statut Membre Dernière intervention 25 avril 2008 - 12 mars 2008 à 15:05
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 -
<ol><li class="li1">
#include <stdio.h>
</li><li class="li1">
#include <stdlib.h>
</li><li class="li1">
#include <conio.h>         // Bibliothèques utiles
</li><li class="li1">
#include <string.h>
</li><li class="li1">
#include
</li><li class="li1">
#include <fcntl.h>
</li><li class="li1">
 
</li><li class="li1">
 
</li><li class="li1">
void find_TransportStream_synchro_bytes(void);
</li><li class="li1">
//void display_usage(void);
</li><li class="li1">
void press_key(char press_key_text[]);             // Liste provisoire des prototypes de nos fonctions
</li><li class="li1">
void exit_prog(char error_msg[]);                  //   --> à mettre dans le fichier header
</li><li class="li1">
unsignedint menu(void);
</li><li class="li1">
long get_ip_file_length (char *ip_filepath);
</li><li class="li1">
void file_seek(int offset);
</li><li class="li1">
void option_menu1();
</li><li class="li1">
void option_menu2();
</li><li class="li1">
 
</li><li class="li1">
 
</li><li class="li1">
struct TransportStream_header                  
</li><li class="li1">
{
</li><li class="li1">
unsignedchar synchro_byte;
</li><li class="li1">
unsignedchar transport_error_ind;
</li><li class="li1">
unsignedchar payload_start_indicator;
</li><li class="li1">
unsignedchar transport_priority;            // Structure  de l'en-tête TS d'un flux MPEG
</li><li class="li1">
unsignedint PID;
</li><li class="li1">
unsignedchar transport_scrambling_control;
</li><li class="li1">
unsignedchar adaptation_field_control;
</li><li class="li1">
unsignedchar continuity_counter;
</li><li class="li1">
} TransportStream_header;
</li><li class="li1">
 
</li><li class="li1">
 
</li><li class="li1">
FILE *ip_file = NULL;                      // déclaration et initialisation d'un pointeur de type FILE
</li><li class="li1">
 
</li><li class="li1">
 
</li><li class="li1">
char *ip_filepath;            // Pointeur sur les arguments de la ligne de commande
</li><li class="li1">
int synchro_bytes[10];    // Stockage des octets de synchro
</li><li class="li1">
unsignedchar TransportStream_raw_header[4]; //4 octets réservés pour la lecture des données du flux
</li><li class="li1">
long ip_file_length;   // Longueur du fichier
</li><li class="li1">
char choix_menu;
</li><li class="li1">
 
</li><li class="li1">
 
</li><li class="li1">
//=============================================Fonction Principale=================================
</li><li class="li1">
int main (int argc, int *argv[])  
</li><li class="li1">
 
</li><li class="li1">
{
</li><li class="li1">
 
</li><li class="li1">
char path[200];
</li><li class="li1">
FILE *ip_file = NULL;                                        
</li><li class="li1">
printf("Tapez ici un chemin valide d'une video MPEG-2 :\n");
</li><li class="li1">
scanf ("%s", path);
</li><li class="li1">
ip_file = fopen(path, "rb");
</li><li class="li1">
 
</li><li class="li1">
//if (argc==1)             // Si rien n'est donné en paramètre, on quitte l'appli
</li><li class="li1">
//{  
</li><li class="li1">
//      exit_prog("");    
</li><li class="li1">
//}
</li><li class="li1">
 
</li><li class="li1">
//while (argc>1)          
</li><li class="li1">
//{
</li><li class="li1">
 
</li><li class="li1">
//ip_file = fopen("C:\\Documents and Settings\\dgombert\\Bureau\\videotest.mpg", "rb");
</li><li class="li1">
 
</li><li class="li1">
//}
</li><li class="li1">
 
</li><li class="li1">
//Récupération de la longueur en octets
</li><li class="li1">
ip_file_length = get_ip_file_length(ip_filepath);
</li><li class="li1">
 
</li><li class="li1">
printf("Ouverture du fichier MPEG %s contenant %d octets. \n", ip_filepath,ip_file_length);
</li><li class="li1">
 
</li><li class="li1">
//Lecture seule, en mode binaire
</li><li class="li1">
ip_file = fopen(ip_filepath, "rb");
</li><li class="li1">
 
</li><li class="li1">
// Trouve les octets de synchro
</li><li class="li1">
find_TransportStream_synchro_bytes();
</li><li class="li1">
 
</li><li class="li1">
// Retourne se placer au premier octet de synchro
</li><li class="li1">
fseek(ip_file, synchro_bytes[1], 0);
</li><li class="li1">
 
</li><li class="li1">
// Affichage du Menu
</li><li class="li1">
choix_menu = menu();
</li><li class="li1">
      switch(choix_menu)
</li><li class="li1">
          {
</li><li class="li1">
                case'1':
</li><li class="li1">
        option_menu1();
</li><li class="li1">
                break;
</li><li class="li1">
                case'2':
</li><li class="li1">
    option_menu2();
</li><li class="li1">
                break;
</li><li class="li1">
                case'3':
</li><li class="li1">
    exit_prog("");
</li><li class="li1">
                break;
</li><li class="li1">
                default:
</li><li class="li1">
        puts("\nERREUR : Ceci n'est pas une entrée correcte");
</li><li class="li1">
          }
</li><li class="li1">
 
</li><li class="li1">
exit_prog("");
</li><li class="li1">
 
</li><li class="li1">
return0;
</li><li class="li1">
 
</li><li class="li1">
}
</li><li class="li1">
 
</li><li class="li1">
//===================================================================================================
</li><li class="li1">
 
</li><li class="li1">
void find_TransportStream_synchro_bytes(void)
</li><li class="li1">
{
</li><li class="li1">
   int synchro_data = 0;
</li><li class="li1">
   long nbre_synchro_data = 0;
</li><li class="li1">
   int position_file = 0;
</li><li class="li1">
 
</li><li class="li1">
   while(!feof(ip_file) && nbre_synchro_data<100)  // utilisation de feof pour trouver les éventuelles erreurs de fread
</li><li class="li1">
   {
</li><li class="li1">
            position_file = ftell(ip_file);         // Repère la position où nous sommes dans le fichier
</li><li class="li1">
                synchro_data = 0;                       // Pour pouvoir récomparer avec la valeur 0x47...
</li><li class="li1">
            fread(&synchro_data,1,1,ip_file);       // Lit octet par octet ip_file et enregistre l'octet dans synchro_data  
</li><li class="li1">
            switch(synchro_data)
</li><li class="li1">
                {
</li><li class="li1">
                 case 0x47 :
</li><li class="li1">
                                synchro_bytes[nbre_synchro_data] = position_file; // Stockage du nouvel octet de synchro trouvé
</li><li class="li1">
                                nbre_synchro_data++;  // On incrémente jusqu'à 100...
</li><li class="li1">
                                file_seek(187);      // Aller chercher, 187 octets plus loin, le nouvel octet de synchronisation
</li><li class="li1">
                        break;
</li><li class="li1">
 
</li><li class="li1">
                 default :
</li><li class="li1">
                                nbre_synchro_data = 0;
</li><li class="li1">
 
</li><li class="li1">
                }
</li><li class="li1">
   }
</li><li class="li1">
   if(nbre_synchro_data<100)
</li><li class="li1">
   {
</li><li class="li1">
 
</li><li class="li1">
   exit_prog("Erreur : Fin du fichier atteinte avant d'avoir trouvé les 100 octets de synchronisation");
</li><li class="li1">
   
</li><li class="li1">
   }
</li><li class="li1">
}
</li><li class="li1">
 
</li><li class="li1">
//=================================================================================================
</li><li class="li1">
 
</li><li class="li1">
//void display_usage(void)
</li><li class="li1">
//{
</li><li class="li1">
//      puts("Usage:\t TSDECODE -i of TS file to decode");
</li><li class="li1">
//      puts("\t \t  -p<search PID>");
</li><li class="li1">
//      puts("\t \t  -q do not show progress when extracting");
</li><li class="li1">
//
</li><li class="li1">
//      puts("\nExample: TSDECODE -ic:\\test.mpg -p600");
</li><li class="li1">
//      puts("\t will open file c:\\videotest.mpg and process PID x packets\n");
</li><li class="li1">
 
</li><li class="li1">
//}
</li><li class="li1">
 
</li><li class="li1">
//=================================================================================================
</li><li class="li1">
 
</li><li class="li1">
void press_key(char press_key_text[])
</li><li class="li1">
{       
</li><li class="li1">
        printf("%s", press_key_text);            
</li><li class="li1">
        while( !_kbhit())
</li><li class="li1">
        {;}
</li><li class="li1">
        _getch();
</li><li class="li1">
}
</li><li class="li1">
 
</li><li class="li1">
//================================================================================================
</li><li class="li1">
 
</li><li class="li1">
void exit_prog(char error_msg[])
</li><li class="li1">
{
</li><li class="li1">
        printf("\n%s\n", error_msg);          
</li><li class="li1">
        _fcloseall();
</li><li class="li1">
        press_key("Press a key to exit...");
</li><li class="li1">
        exit(0);
</li><li class="li1">
}  
</li><li class="li1">
 
</li><li class="li1">
//===============================================================================================
</li><li class="li1">
 
</li><li class="li1">
unsignedint menu(void)
</li><li class="li1">
{       
</li><li class="li1">
        puts("Menu:");
</li><li class="li1">
    puts("1 - Decodage de l'en-tête");
</li><li class="li1">
        puts("2 - Extraire le PES");        // Menu à développer avec de nouvelles options
</li><li class="li1">
        puts("3 - Exit");
</li><li class="li1">
 
</li><li class="li1">
        puts("\nEntrer_choix:");
</li><li class="li1">
        scanf("%s", &choix_menu);
</li><li class="li1">
 
</li><li class="li1">
        return  choix_menu;
</li><li class="li1">
}
</li><li class="li1">
 
</li><li class="li1">
//=================================================================================================
</li><li class="li1">
 
</li><li class="li1">
long get_ip_file_length (char *ip_filepath)
</li><li class="li1">
{
</li><li class="li1">
int ip_file_bis = 0;
</li><li class="li1">
ip_file_bis = _open(ip_filepath,_O_RDONLY);
</li><li class="li1">
   
</li><li class="li1">
  if(ip_file_bis == -1)
</li><li class="li1">
        {
</li><li class="li1">
            exit_prog("Erreur : Impossible d'ouvrir le fichier specifie");
</li><li class="li1">
        }
</li><li class="li1">
 
</li><li class="li1">
ip_file_length = _filelength(ip_file_bis);
</li><li class="li1">
_close(ip_file_bis);
</li><li class="li1">
return ip_file_length;
</li><li class="li1">
}
</li><li class="li1">
 
</li><li class="li1">
//================================================================================================
</li><li class="li1">
 
</li><li class="li1">
void file_seek(int offset)
</li><li class="li1">
{
</li><li class="li1">
     if(ftell(ip_file) + offset > ip_file_length)
</li><li class="li1">
         {
</li><li class="li1">
         press_key("Fin du fichier");
</li><li class="li1">
         }
</li><li class="li1">
 
</li><li class="li1">
fseek(ip_file, offset, 1);
</li><li class="li1">
 
</li><li class="li1">
}
</li><li class="li1">
 
</li><li class="li1">
//===============================================================================================
</li><li class="li1">
 
</li><li class="li1">
void option_menu1()
</li><li class="li1">
{
</li><li class="li1">
 
</li><li class="li1">
TS_decode();
</li><li class="li1">
 
</li><li class="li1">
 
</li><li class="li1">
}
</li><li class="li1">
 
</li><li class="li1">
//==============================================================================================
</li><li class="li1">
 
</li><li class="li1">
 
</li><li class="li1">
void option_menu2()
</li><li class="li1">
{
</li><li class="li1">
 
</li><li class="li1">
 
</li><li class="li1">
}
</li></ol>

Mais pendant l'execution, il me dit "impossible d'ouvrir le fichier spécifié"
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? (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 , si quelqu'un pouvait m'aider s'il vous plait..

Bonne journée à tous !

34 réponses

Neo_Fr Messages postés 653 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 10 novembre 2014 2
12 mars 2008 à 14:43
3
Neo_Fr Messages postés 653 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 10 novembre 2014 2
12 mars 2008 à 15:03
Ok, surement un pb ac le fichier, suffit de rajouter des system("PAUSE") ds la gestion des erreurs pour en connaitre la raison exacte..

Neo_Fr
3
Neo_Fr Messages postés 653 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 10 novembre 2014 2
10 mars 2008 à 14:43
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
0
dayvid75014 Messages postés 96 Date d'inscription mercredi 5 mars 2008 Statut Membre Dernière intervention 25 avril 2008
10 mars 2008 à 14:53
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...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
dayvid75014 Messages postés 96 Date d'inscription mercredi 5 mars 2008 Statut Membre Dernière intervention 25 avril 2008
10 mars 2008 à 14:56
en plus ton code se compile avec 15 erreurs...
0
Neo_Fr Messages postés 653 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 10 novembre 2014 2
10 mars 2008 à 14:58
ta bien ajouter #include <windows.h> ?

Neo_Fr
0
dayvid75014 Messages postés 96 Date d'inscription mercredi 5 mars 2008 Statut Membre Dernière intervention 25 avril 2008
10 mars 2008 à 15:00
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)
0
dayvid75014 Messages postés 96 Date d'inscription mercredi 5 mars 2008 Statut Membre Dernière intervention 25 avril 2008
10 mars 2008 à 15:01
ç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.
0
dayvid75014 Messages postés 96 Date d'inscription mercredi 5 mars 2008 Statut Membre Dernière intervention 25 avril 2008
10 mars 2008 à 15:01
ç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.
0
Neo_Fr Messages postés 653 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 10 novembre 2014 2
10 mars 2008 à 15:04
Remplace la ligne de strcpy par ca:
strcpy(szFilePath, (LPCSTR)argv[1]);

Neo_Fr
0
dayvid75014 Messages postés 96 Date d'inscription mercredi 5 mars 2008 Statut Membre Dernière intervention 25 avril 2008
10 mars 2008 à 15:05
j'essaye, merci !
0
dayvid75014 Messages postés 96 Date d'inscription mercredi 5 mars 2008 Statut Membre Dernière intervention 25 avril 2008
10 mars 2008 à 15:06
oui merci Neo, ça compile sans erreur ; mais qu'est ce que je peux faire avec ton bout de code ? comment puis-je l'implementer dans mon programme de maniere efficace? Je ne vois pas trop où tu veux en venir, surtout que quand j'execute ton programme, la console apparait un quart de seconde et disparait de suite ... :s
0
dayvid75014 Messages postés 96 Date d'inscription mercredi 5 mars 2008 Statut Membre Dernière intervention 25 avril 2008
10 mars 2008 à 15:07
en fait le probleme cest que je ne suis pas familier du tout avec cette bibliothèque...
0
dayvid75014 Messages postés 96 Date d'inscription mercredi 5 mars 2008 Statut Membre Dernière intervention 25 avril 2008
10 mars 2008 à 15:09
ça marche
 mais je ne comprends pas trop à quoi ce code va me servir ? Comment vais-je l'implémenter au sein de mon propre code?
0
Neo_Fr Messages postés 653 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 10 novembre 2014 2
10 mars 2008 à 15:16
La fonction que je t'est faite permet d'obtenir l'emplacement dans le fichier des octets de synchronisation, c'est un peut l'equivalent de ta fonction find_TransportStream_synchro_bytes

par exemple:
DWORD dwSynchroneBytes[100];
GetSynchroneBytes("C:\\video.mpg", dwSynchroneBytes, 100);
la fonction va mettre dans dwSynchroneBytes la position des 100 premiers octets de synchronisation (0x47) de ton fichier video.mpg.

C'est bien ce que tu cherchais a faire non?

Neo_Fr
0
dayvid75014 Messages postés 96 Date d'inscription mercredi 5 mars 2008 Statut Membre Dernière intervention 25 avril 2008
10 mars 2008 à 15:23
oui bien sûr mais là n'était pas mon problème...

Pdt l'exécution, il me dit "impossible d'ouvrir le fichier spécifié" ... c'était ça mon réel problème

désolé si je me suis mal exprimé...
0
Neo_Fr Messages postés 653 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 10 novembre 2014 2
10 mars 2008 à 15:37
Comment tu ti prend pour recuperer le chemin et pour ouvrir le fichier?

Neo_Fr
0
dayvid75014 Messages postés 96 Date d'inscription mercredi 5 mars 2008 Statut Membre Dernière intervention 25 avril 2008
10 mars 2008 à 15:42
comme ça :

int main (int argc, int *argv[]) 
{

if (argc==1)             // Si rien n'est donné en paramètre, on quitte l'appli
{    
 exit_prog("");   
}


while (argc>1)         
{
ip_filepath = &argv[1][2];
}
++argv;

//Récupération de la longueur en octets
ip_file_length = get_ip_file_length(ip_filepath);


printf("Ouverture du fichier MPEG %s contenant %d octets. \n", ip_filepath,ip_file_length);


//Lecture seule, en mode binaire
ip_file = fopen(ip_filepath, "rb");
 
// Trouve les octets de synchro
find_TransportStream_synchro_bytes();
 
// Retourne se placer au premier octet de synchro
fseek(ip_file, synchro_bytes[1], 0);


// Affichage du Menu
choix_menu = menu();

et ensuite l'utilisateur viendra récupérer tout un tas d'octet qui l'interesse via un menu pour effectuer sa sélection.. mais lorsque dans la console j'entre le chemin (en faisant directement glisser le fichier vidéo dans la console) il me dit "impossible d'ouvrir le fichier spécifié"
 
Tu vois un peu mon souci?
0
Neo_Fr Messages postés 653 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 10 novembre 2014 2
10 mars 2008 à 16:03
Tu pourrais récuperer tes arguments comme j'ai fait plus haut ainsi tu a juste a glisser ta video sur l'icone de ton prog..

if(argc < 2) return 0;
strcpy(szFilePath, (LPCSTR)argv[1]);

Neo_Fr
0
dayvid75014 Messages postés 96 Date d'inscription mercredi 5 mars 2008 Statut Membre Dernière intervention 25 avril 2008
10 mars 2008 à 16:14
jsuis perdu snif... je ne vois vraiment pas Néo. Tu ne veux pas m'éclairer un peu plus, jten supplie, je sens que je ne suis pas loin. As tu compiler mon code ? il tourne mais plante au moment de rentrer un fichier MPEG. Je ne vois pas comment rajouter ton code dans mon code afin que ça me soit profitable. Help me pleeeeease :)
0
Rejoignez-nous