IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Lecture correcte d'un header en mp3


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 15
    Par défaut Lecture correcte d'un header en mp3
    Bonjour j'essaye de faire un programme qui lit l'header d'un mp3 et son tag
    , malheureusement pour l'header ça ne fonctionne pas très bien

    Pour connaitre les données je me suis inspiré de : http://www.mpgedit.org/mpgedit/mpeg_...MP3Format.html

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
     
    #include <stdio.h>
    #include <stdlib.h>
     
    void AfficherTAG(char entree[]);
     
    int main()
    {
    	int i, tmp, octets4, bits[32];
    	char entree[32] = "HappyEnd.mp3"; 
     
    	// Ouverture du mp3 en lecture binaire
    	FILE* fichier = NULL;
    	fichier = fopen(entree, "rb");
    	AfficherTAG(entree); 
     
    	// On se place au début du fichier
    	// On récupère les 32 bits premiers bits = 4 octets = 1 int
    	fseek(fichier, 0, SEEK_SET);
    	fread(&octets4, sizeof(octets4), 1, fichier);
     
    	// Conversion en binaire dans le bon sens de lecture :)
    	tmp = octets4;
    	for (i = 32 - 1; i >= 0; i--)
    	{
    		bits[i] = tmp % 2;
    		tmp = tmp /2;
    	}
     
    	// Affichage
    	printf("\nHeader du mp3 :");
    	printf("\nEn décimal => %d\n", octets4);
    	printf("En binaire => ");
    	for(i = 0; i < 32; i++)
    		printf("%d  ", bits[i]);
     
    	// Type de codage
    	if ((bits[20] == 1) && (bits[19] == 0))
    		printf("\n=> MPEG 2");
     
    	if ((bits[20] == 1) && (bits[19] == 1))
    		printf("\n=> MPEG 1");
     
    	// Protection
    	if (bits[16] == 0)
    		printf("\n=> Protégé");
    	else
    		printf("\n=> Non protégé");
     
    	// Layer III
    	if ((bits[18] == 0) && (bits[17] == 1))
    		printf("\n=> Layer III");		
     
    	// Channel Mode
    	if (bits[7] == 0 && bits[6] == 0)
    		printf("\n=> Stereo");
     
    	if (bits[7] == 0 && bits[6] == 1)
    		printf("\n=> Joint Stereo");
     
    	if (bits[7] == 1 && bits[6] == 0)
    		printf("\n=> Dual Channel");
     
    	if (bits[7] == 1 && bits[6] == 1)
    		printf("\n=> Single Channel");
     
     
    	printf("\n");	
     
    	// Fermeture du fichier
    	fclose(fichier);
    	return 0;
    }
    Conformément à la documentation trouvée, j'ai bien 10 bits à 1 du bit 21 à 31, donc je pense que mon fread est bon, ma conversion binaire a l'air bonne aussi (enfin en comparant avec la calculatrice)...

    Le problème est pour le Layer III où je suis censé trouvé le bits 18 et 17 respectivement à 0 et 1 et bien na c'est pas du mp3 selon mon programme... autre soucis concernant le Channel Mode pour le mp3 en question il s'agit d'un Joint Stereo et j'ai des bits qui affirment que c'est du Stereo tout court awww...

    Exemple d'execution de mon programme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    ./a.out 
     
    TAG = TAG
    Titre = Kaze Wo Atsumete              
    Artiste = Happy End                     
    Album = Kazemachi Roman               
    Annee = 1971
    Commentaire = achete en import :)         
    Piste = 3
     
    Header du mp3 :
    En décimal => 1083374591
    En binaire => 0  1  0  0  0  0  0  0  1  0  0  1  0  0  1  0  1  1  1  1  1  0  1  1  1  1  1  1  1  1  1  1  
    => MPEG 1
    => Non protégé
    => Stereo


    Je ne vois pas d'où ça peut venir, je suis en 64bits mais mon int fait quand même 4 octets donc ça peut pas être là le problème...

    Je suis un peu perdu je ne vois pas d'où pourrait venir mon erreur (je sais mon code est (très très très loin) d'être parfait (pas de test pour ouvrir et fermer le fichier etc...).

  2. #2
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Je ne me rappelle plus très bien du format mp3 mais es-tu sûr que ta boucle de lecture des bits ne devrait pas s'écrire : for (i = 0; i < 32; i++) ... comme dans l'affichage ? As-tu déjà testé ce cas ? En outre, il y a des moyens plus simples et plus souples d'accéder à un bit : [FAQ] Comment accéder à un bit d'une donnée ?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 15
    Par défaut
    Citation Envoyé par Melem Voir le message
    Je ne me rappelle plus très bien du format mp3 mais es-tu sûr que ta boucle de lecture des bits ne devrait pas s'écrire : for (i = 0; i < 32; i++) ... comme dans l'affichage ? As-tu déjà testé ce cas ? En outre, il y a des moyens plus simples et plus souples d'accéder à un bit : [FAQ] Comment accéder à un bit d'une donnée ?
    Oui mais ça change juste le sens, par contre ... je viens de remarquer de quelque chose de pas normal en ce qui concerne les bits qui sont censés être à 1 (du bit 21 à 31), il doit y en avoir 11 et pas 10 comme je le pensais :o, mais probablement qu'avec un décalage à droite j'aurai mes bonnes valeurs.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 15
    Par défaut
    Bon j'ai tenté d'utiliser la méthode avec un masque pour obtenir directement les bits, mais j'obtiens finalement bien la même choses qu'avec ma fonction de conversion en binaire. Je pense que ça vient peut - être du fread.

    Le header est sur les 32 premiers bits du fichier mp3
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    // on se positionne au début du fichier
    fseek(fichier, 0, SEEK_SET);
     
    // int => 4 octets
    int nombre; 
     
    // 32 bits = 4 octets, 1 déplacement
    fread(&nombre, 4, 1, fichier);
    Je pense que c'est bien ça, mais je demande confirmation car je me mets à douter de tout :o

  5. #5
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Je le pense aussi. D'après la spec, l'entier que tu veux récupérer est stocké en big-endian ou en little endian ? Et ton système, est-il en big ou little endian ? Il faut peut-être penser à inverser l'ordre des octets, pour adapter la représentation de l'entier à la représentation utilisée par ton système.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    char octets4[4];
    fread(octets4, 4, 1, file);
    permuter(&octets4[0], &octets4[3]);
    permuter(&octets4[1], &octets4[2]);
    ...
    int nombre;
    memcpy(&nombre, octets4, 4);
    /* Maintenant, lire les bits de nombre */

Discussions similaires

  1. [MP3] Script lecture ID3 ?
    Par ecocentric dans le forum Multimédia
    Réponses: 3
    Dernier message: 17/05/2007, 03h32
  2. lecture d'un fichier en mp3
    Par krapoulos dans le forum Langage
    Réponses: 1
    Dernier message: 11/06/2006, 17h44
  3. Lecture simultanée de 2 fichiers MP3
    Par mweber_29200 dans le forum C++Builder
    Réponses: 4
    Dernier message: 25/05/2006, 14h07
  4. [cURL] Lecture du résultat dans le Header
    Par loukili81 dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 19/05/2006, 11h25
  5. [MFC]lecture d'un fichier mp3
    Par r0d dans le forum MFC
    Réponses: 6
    Dernier message: 26/01/2006, 02h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo