dayvid75014
Messages postés96Date d'inscriptionmercredi 5 mars 2008StatutMembreDernière intervention25 avril 2008
-
10 mars 2008 à 12:01
dayvid75014
Messages postés96Date d'inscriptionmercredi 5 mars 2008StatutMembreDernière intervention25 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.
</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">
//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">
// 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">
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">
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..
Neo_Fr
Messages postés653Date d'inscriptionmardi 6 décembre 2005StatutMembreDernière intervention10 novembre 20142 10 mars 2008 à 16:57
J'avais pas remarquer mais dans ta fonction get_ip_file_length tu utilise _open, une vieille fonction qui peut poser probleme remplace cette fonction par celle ci dessous et essaye:
dayvid75014
Messages postés96Date d'inscriptionmercredi 5 mars 2008StatutMembreDernière intervention25 avril 2008 12 mars 2008 à 10:00
tu vas la retrouver après ? je sais pas où j'ai envoyé mon fichier, mais il a pas l'air d'avoir été envoyé.. Peux-tu me donner ton adresse mail free s'il te plait?
dayvid75014
Messages postés96Date d'inscriptionmercredi 5 mars 2008StatutMembreDernière intervention25 avril 2008 12 mars 2008 à 10:40
ça avance doucement mais surement... désormais j'ai bien 50 info qui s'affichent sur ma console mais ce sont des caractères.. je n'arrive pas à les afficher sous forme d'octet... même avec atoi(buffer[i]) ça ne marche pas.
dayvid75014
Messages postés96Date d'inscriptionmercredi 5 mars 2008StatutMembreDernière intervention25 avril 2008 12 mars 2008 à 14:45
Sinon j'en ai un qui marche :
#include <windows.h>
#include <stdio.h>
int main(int argc, char *argv[])
{
FILE *ip_file=NULL;
char ip_filepath[260];
int ip_file_length=0,i;
int size;
char buffer[100];
if (argc == 1) //S'il n'y a pas d'argument, on demande à l'utilisateur d'entrer la chaine
{
printf("Entrer le chemin de la video:\n");
//scanf("%s",ip_filepath); //Attention n'accepte pas les espaces
gets(ip_filepath); //Accepte tout jusqu'à l'appuie sur entrée
}
else //entrée d'une chaine en argument du main (en passant par l'invite de commande)
{
strcpy(ip_filepath,&argv[1][0]); //ip_filepath pointe sur le premier argument premier caractere
}
ip_file = fopen(ip_filepath, "rb");
if(ip_file==NULL){ //test
printf("Erreur à l'ouverture du fichier\n");
exit(0);
}
fseek (ip_file , 0, SEEK_END); //On se place a la fin du fichier
ip_file_length=ftell (ip_file ); //Retourne le nombre d'octet depuis le debut du fichier jusqu'a la position du curseur(ici la fin)
rewind (ip_file); //on se replace au debut du fichier
for(i=0;i<50;i++) //juste les 50 premiers
{
printf("0x %x \n" , (unsigned char)Buffer[i]); //affichage des octets sous forme de caractère et NON en héxa -----> PROBLEME!!!
//int atoi(char buffer[i]);
}
dayvid75014
Messages postés96Date d'inscriptionmercredi 5 mars 2008StatutMembreDernière intervention25 avril 2008 12 mars 2008 à 14:50
nan désolé mais ton code ne marche pas chez moi... mais celui que je viens de copie-colle marche à merveille et affiche les 50 premiers octets de n'importe quel ficher MPEG, du moment que le fichier est stocké dans la racine. Peut-etre sais-tu pourquoi ça fait ça ? dès que je le mets ailleurs que C:\mavidéo.mpg ça ne marche plus (la console disparait tout de suite après avoir validé le chemin)
dayvid75014
Messages postés96Date d'inscriptionmercredi 5 mars 2008StatutMembreDernière intervention25 avril 2008 12 mars 2008 à 14:59
ce n'est pas grave Neo, ne te prend pas la tête, je t'ai expliqué plus haut ce qu'il faisait...: une fois l'exe lancé et le chemion entré en argument la console disparait.. mais t'embete pas, tout marche comme sur des roulettes, en grande partie grace a toi !