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 :cry:
Pour connaitre les données je me suis inspiré de : http://www.mpgedit.org/mpgedit/mpeg_...MP3Format.html
Code:
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:
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 |
http://img714.imageshack.us/img714/914/pouetb.jpg
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...).