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
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)...
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; }
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...).
Partager