ZLIB, un format bien mystérieux...

ZLIB, un format bien mystérieux... - Divers - Programmation

Marsh Posté le 05-07-2005 à 22:38:20    

bonjour,
 
j'ai des musiques en format PSF et PSF2, dedans il y a les samples (échantillons sonores) des instruments utilisés qui sont compressés avec l'algorithme zlib. (si la zik a par exemple 40 samples, ben dans le fichier PSF2 y'aura 40 fichiers zlib un peu éparpillés partout)
 
après pas mal de recherches je fabrique un petit programme pour chopper les fichiers zlib, j'ai trouvé que les fichiers zlib commencent par 78DA (en hexadecimal) donc je demande a mon prog d'extraire des données dès qu'il tombe sur un 78DA.
 
je scanne tous les fichiers obtenus une fois extraits du .psf2, et comme prévu je trouve des samples. mais le problème c'est que mon programme semble ne pas repérer tous les fichiers zlib contenus dans le fichier (il me manque la moitié des samples), a croire que tous les fichiers zlib ne commencent pas tous par 78DA !
un autre probleme, c'est que les quelques samples qui ont pu etre extrait sont rarement entiers (!), il n'y en a qu'un bout  :heink:  . je regarde la taille des fichiers valides dans lesquels un sample a été trouvé: bizarre ils font tous 32ko, soit 32768 octets ! (comme par hasard  :heink: )
 
je voudrais savoir comment faire pour deja détecter la présence d'un fichier zlib dans un fichier, et ensuite comment l'extraire correctement de manière a ce que quand on le décompresse que le fichier obtenu soit entier (avoir un 'bout' de 32ko du sample c'est pas le top quand meme  :D ).
par ailleurs je voudrais savoir aussi si il y a au début du fichier zlib quelques bytes qui indiquent la taille du fichier (ça m'aiderait beaucoup je pense)

Reply

Marsh Posté le 05-07-2005 à 22:38:20   

Reply

Marsh Posté le 05-07-2005 à 23:23:55    

On dirait que 78DA correspondent au début de paquet Zlib (Compression Method and flags):
 http://www.faqs.org/rfcs/rfc1950.html
 
Et effectivement, 0x78DA est un multiple de 31.
 
Tu es sûr que ce n'est pas gzip qui est utilisé pour compresser les samples (auquel cas tu as un header à l'extérieur avec plus d'infos sur le flux compressé) ?

Reply

Marsh Posté le 06-07-2005 à 11:40:19    

apparement non, seul le zlib est utilisé. (j'ai le les docs du plugin winamp pour ce format, et l'auteur parle parle que de zlib et pas de gzip..)
 
j'ai trouvé une fiche qui explique le fonctionnement du psf2, mais elle parle pas trop des samples : http://www.neillcorlett.com/psf/psf_format.txt  (voir section PSF2)
 
en fait si j'essaye d'extraire des samples qui font a l'origine moins de 32ko ça marche très bien (j'ai le son en entier) mais bizarrement je peux pas dépasser les 32ko! (même si le fichier extrait "brut" est bien plus gros, une fois que j'y applique la décompression zlib, ça fait jamais plus de 32ko)
 
je suppose que dans le fichier psf2, il a forcément un endroit qui indique l'offset de tous les samples dans le fichier, sinon le lecteur ne pourrait pas lire correctement la musique...  
j'avais fait un test inversé: j'ai un ptit fichier et je le compresse en zlib... je regarde le fichier une fois compressé, et il ne commence pas par 78DA mais par 789C... là je comprends plus ^^
 
si tu veux je peux te passer un fichier psf2 pour que tu regardes, moi je suis vraiment bloqué là  :heink:


Message édité par xphanoo le 06-07-2005 à 11:41:58
Reply

Marsh Posté le 06-07-2005 à 13:28:41    

j'ai trouvé que le 2eme byte dépend du nievau de compression.
 
compression extreme: 78DA
compression standard: 789C
compression faible: 785E
 
je vais voir si je choppe plus de samples en incluant 789C et 785E a mon programme

Reply

Marsh Posté le 02-08-2005 à 16:34:36    


Bonjour,
 
Je n'ai pas de solution à ton problème, xphanoo, mais il m'interesse :). En effet, j'ai un peu le problème inverse : je cherche à ecrire des données compréssées (en l'occurence des images), dans un fichier (en l'occurence, un .swf). Les spécifications fournis par macromédia précisent bien que les images incrustées sont compressées à l'aide de zlib. Mais je ne parviens à utiliser zlib correctement pour construire un swf valide.
Pour m'aider à comprendre comment c'était fait, j'ai construit une animation flash contenant uniquement une image de 2*2 pixel entièrement blanc (on ne peut plus simple). et je l'ai compilé avec flash mx. J'ai observé le swf ainsi produit et j'ai reussi à identifer le bloc d'octet qui contient les données de l'image compréssée et celui ci commence bien par 0x78DA. L'ennui, c'est que je ne parviens même pas à décompresser ce bloc de données. Chose que tu es visiblement parvenu à faire. Donc à l'aide de quelle dll et fonction y es-tu arrivé ?
 
Voilà, merci d'avance,
Flo

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed