Encodage des tags MP3

[Résolu]
Signaler
Messages postés
223
Date d'inscription
mercredi 31 mai 2006
Statut
Membre
Dernière intervention
5 mai 2014
-
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
-
Salut !

Voila, j'arrive à récupérer les tags de mp3 quels qu'ils soient, mais les caractères spéciaux me battent. Impossible de récupérer les é, ï, è ....
J'utilise ASCIIEncoding()

Qu'est ce qu'il faut que j'utilise d'autre si ce n'est pas ca ?

MMN

9 réponses

Messages postés
223
Date d'inscription
mercredi 31 mai 2006
Statut
Membre
Dernière intervention
5 mai 2014

Nan c'est pas ça ! Mais j'ai trouvé c cool.


En fait c'est la première des 2 lignes rouges qui me posait problème.
Voila la solution qui marche : (pour récupérer l'artiste des tags ID2)
Pour les autres tags, c'est if (flag.CompareTo("TPE1") == 0) qu'il faut changer (pour info).








public



string
getArtisteID2(

string
MP3){


FileStream
FS =

new



FileStream
(MP3,

FileMode
.Open);


byte
[] Buffer =

new



byte
[4];


int
[] nb =

new



int
[4];FS.Seek(0,


SeekOrigin
.Begin);FS.Read(Buffer, 0, 3);



Encoding
instEncoding = System.Text.

Encoding



.GetEncoding(1252);





string
filetype = instEncoding.GetString(Buffer);


string
valTag;


int
fs = 1;


if
(filetype.StartsWith(

"ID3"
)){

FS.Seek(6,


SeekOrigin
.Begin);FS.Read(Buffer, 0, 4);

nb[3] = Buffer[3] | ((Buffer[2] & 1) << 7);

nb[2] = ((Buffer[2] >> 1) & 63) | ((Buffer[1] & 3) << 6);

nb[1] = ((Buffer[1] >> 2) & 31) | ((Buffer[0] & 7) << 5);

nb[0] = ((Buffer[0] >> 3) & 15);


ulong
FrameSize = 10 + (

ulong
)nb[3] | ((

ulong
)nb[2] << 8) | ((

ulong
)nb[1] << 16) | ((

ulong
)nb[0] << 24);


int
TagSize =

Convert
.ToInt32(FrameSize);


string
flag;


int
i = 0;


while
(i < TagSize && fs > 0){

i += 10;

FS.Seek(i,


SeekOrigin
.Begin);FS.Read(Buffer, 0, 4);

flag = instEncoding.GetString(Buffer);

FS.Seek(i + 4,


SeekOrigin
.Begin);FS.Read(Buffer, 0, 4);

fs =


Convert
.ToInt32(((

uint
)Buffer[0] << 24) + ((

uint
)Buffer[1] << 16) + ((

uint
)Buffer[2] << 8) + ((

uint
)Buffer[3]));


byte
[] s =

new



byte
[fs];FS.Seek(i + 10,


SeekOrigin
.Begin);FS.Read(s, 0, fs);



Decoder
d =

Encoding

.GetEncoding(

"iso-8859-1"



).GetDecoder();


//Encoding.UTF8.GetDecoder();






char
[] chars =

new



Char
[d.GetCharCount(s, 0, fs)];


int
charLen d.GetChars(s, 0, s.Length, chars, 0);valTag


""
;


for
(

int
j = 0; j < chars.Length; j++){


if
(chars[j].ToString() !=

"\0"
){

valTag += chars[j].ToString();

}

}


if
(flag.CompareTo(

"TPE1"
) == 0){

FS.Close();


return
valTag;}

i += fs;

}

FS.Close();


return



""
;}


else
{ FS.Close();

return



""
; }}

}








MMN
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
58
Salut,
Peut-être System.Text.Encoding.GetEncoding("iso-8859-1"));

Depuis le temps que tu traînes avec cette application de tag Mp3, on espère avoir une source bien complète très prochainement.... ;-)

<hr size="2" />VC# forever
Messages postés
223
Date d'inscription
mercredi 31 mai 2006
Statut
Membre
Dernière intervention
5 mai 2014

Hé hé ...
Bidou ==> En tous cas ... heureusement que tu es parmi nous ... Tu m'as souvent filé un gros coup de pouce !
Mais ouais, je vais déposer des sources (dès que j'aurai un peu de temps à moi) !

MMN
Messages postés
223
Date d'inscription
mercredi 31 mai 2006
Statut
Membre
Dernière intervention
5 mai 2014

arf ... ca marche pas mieux, les accents restent mystérieux ...

MMN
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
58
Fait voir la ligne avec laquelle tu ouvres le file...

<hr size="2" />VC# forever
Messages postés
223
Date d'inscription
mercredi 31 mai 2006
Statut
Membre
Dernière intervention
5 mai 2014

Je précise qu'à l'origine c'est une source que j'ai pri sur ce forum (un peu modifiée ce la dit ...) En rouge ,  j'ai surligné la ligne ou je pense qu'est le problême ...








public



string
getArtisteID2(

string
MP3){


FileStream
FS =

new



FileStream
(MP3,

FileMode
.Open);


byte
[] Buffer =

new



byte
[4];


int
[] nb =

new



int
[4];FS.Seek(0,


SeekOrigin
.Begin);FS.Read(Buffer, 0, 3);



Encoding
instEncoding = System.Text.

Encoding

.GetEncoding(

"iso-8859-1"



);





string
filetype = instEncoding.GetString(Buffer);


string
valTag;


int
fs = 1;


if
(filetype.StartsWith(

"ID3"
)){

FS.Seek(6,


SeekOrigin
.Begin);FS.Read(Buffer, 0, 4);

nb[3] = Buffer[3] | ((Buffer[2] & 1) << 7);

nb[2] = ((Buffer[2] >> 1) & 63) | ((Buffer[1] & 3) << 6);

nb[1] = ((Buffer[1] >> 2) & 31) | ((Buffer[0] & 7) << 5);

nb[0] = ((Buffer[0] >> 3) & 15);


ulong
FrameSize = 10 + (

ulong
)nb[3] | ((

ulong
)nb[2] << 8) | ((

ulong
)nb[1] << 16) | ((

ulong
)nb[0] << 24);


int
TagSize =

Convert
.ToInt32(FrameSize);


string
flag;


int
i = 0;


while
(i < TagSize && fs > 0){

i += 10;

FS.Seek(i,


SeekOrigin
.Begin);FS.Read(Buffer, 0, 4);

flag = instEncoding.GetString(Buffer);

FS.Seek(i + 4,


SeekOrigin
.Begin);FS.Read(Buffer, 0, 4);

fs =


Convert
.ToInt32(((

uint
)Buffer[0] << 24) + ((

uint
)Buffer[1] << 16) + ((

uint
)Buffer[2] << 8) + ((

uint
)Buffer[3]));


byte
[] s =

new



byte
[fs];FS.Seek(i + 10,


SeekOrigin
.Begin);FS.Read(s, 0, fs);


Decoder
d =

Encoding
.UTF8.GetDecoder();


char
[] chars =

new



Char
[d.GetCharCount(s, 0, fs)];


int
charLen d.GetChars(s, 0, s.Length, chars, 0);valTag


""
;


for
(

int
j = 0; j < chars.Length; j++){


if
(chars[j].ToString() !=

"\0"
){

valTag += chars[j].ToString();

}

}


if
(flag.CompareTo(

"TPE1"
) == 0){

FS.Close();


return
valTag;}

i += fs;

}

FS.Close();


return



""
;}


else
{ FS.Close();

return



""
; }}









MMN
Messages postés
223
Date d'inscription
mercredi 31 mai 2006
Statut
Membre
Dernière intervention
5 mai 2014

Je crois qu'en fait j'ai fais le boulet
c'est cette ligne la qu'il doit falloir modifier ...
Decoderd =
Encoding.UTF8.GetDecoder();

MMN
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
58
Je dirais même que ce code vient directement de ma source ;-)
Enfin, essayes de remplacer la ligne que tu penses fausse par ceci :
Decoder

d = System.Text.
Encoding.GetEncoding(
"iso-8859-1").GetDecoder();

<hr size="2" />VC# forever
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
58
Euh, j'ai testé avec ma solution, et c'était tout à fait fonctinnel ;-)

<hr size="2" />VC# forever