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 :

Comment récupérer la pochette d'un album ?


Sujet :

C

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    zddzzddz
    Inscrit en
    Mai 2014
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : zddzzddz
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2014
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Comment récupérer la pochette d'un album ?
    Salut tout le monde j'ai déjà fait ce post il y a environ 2 jours quelque chose comme ça, mais aucune réponses vraiment intéressantes ne m'ont été apportés.
    J'aimerais savoir comment récupérer la pochette d'un album car je réalise un petit lecteur mp3. Je pense pouvoir utiliser une fonction de la librairie FMOD : FMOD_Get_Tag(); ? mais je ne suis pas sûr, de plus j'ai repéré une librairie ID3LIB mais impossibles de l'installer. Voilà je cherche une explication claire nette et précise pour un zéro de A à Z.

    Si quelqu’un peut corriger ce code pour m'aider, ça serait très gentil !

    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
    void afficherPochette(Arg *arg)
    {
        SDL_Rect pos;
        pos.x = 200;
        pos.y = 300;
     
        FMOD_TAG tag;
        if(FMOD_Sound_GetTag(arg->music, "APIC", 0, &tag) == FMOD_OK)
        {
            SDL_Surface *pochette = NULL;
            pochette = IMG_Load_RW(SDL_RWFromFile("home.mp3", "rb"), 1);
            if(pochette != NULL)
            {
                SDL_BlitSurface(pochette, NULL, arg->screen, &pos);
            }
        }
    }

  2. #2
    Membre expérimenté Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    623
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 623
    Points : 1 551
    Points
    1 551
    Par défaut
    Hello,
    J'ai déjà répondu à ce post sur oc (anciennement le sdz), je poste la réponse pour ceux que cela intéresserait. La première idée était de trouver le début de l'image jpeg, puis de l'écrire dans un fichier .jpg, affichable alors par sdl via SDL_Load() (sdl_image). Mais quelqu'un a suggéré qu'il était peut-être possible d'utiliser le code de stb_image pour se passer du fichier. J'ai donc étudié la question, démêlé l'écheveau de stb_image (il y a des commentaires, mais bon....) et j'ai pondu ce code, qui fonctionne bien (du moins jusqu'à présent )

    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
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    /*===============================================================================================
    Search if a mp3 files contains the APIC tag, and display image
    ===============================================================================================*/
     
    #include <sdl/sdl.h>
    #include <fmodex/fmod.h>
    #include <fmodex/fmod_errors.h>
     
    #include <windows.h>
    //#include <stdio.h>
    //#include <dos.h>
    //#include <dir.h>
     
    #define STB_IMAGE_IMPLEMENTATION
    #include "../stb_image/stb_image.c" // https://github.com/nothings/stb/blob/master/stb_image.h
     
    void pause(void) {
        SDL_Event event;
        int done=0;
     
        while(!done) {
            SDL_WaitEvent(&event);
            done=event.type==SDL_KEYDOWN || event.type==SDL_MOUSEBUTTONDOWN;
            }
    }
     
    #define WNDP     32
    #define BITS    8
     
    void displayImg(SDL_Surface *wnd,int width,int height,int comp,stbi_uc *img) {
        SDL_Surface *new;
     
        // SDL_CreateRGBSurfaceFrom(): IMPORTANT: voir Description sur http://sdl.beuc.net/sdl.wiki/SDL_CreateRGBSurfaceFrom
        new=SDL_CreateRGBSurfaceFrom(img,width,height,BITS*comp,width*comp,0,0,0,0);
        if(new==NULL) puts("new null");
        else {
            SDL_Rect srcCoo;
            SDL_FillRect(wnd,NULL,SDL_MapRGB(wnd->format,110,110,110));
            srcCoo.x=0;
            srcCoo.y=0;
            srcCoo.w=(new->w>wnd->w)?wnd->w:new->w;
            srcCoo.h=(new->h>wnd->h)?wnd->h:new->h;
            SDL_BlitSurface(new,&srcCoo,wnd,NULL);
            SDL_Flip(wnd);
            pause();
            SDL_FreeSurface(new);
            }
    }
     
    // Affichage de l'image contenue dans un fichier mp3
    // Recherche du tag avec fmod
    // Affichage avec sdl
    // Utilisation de stb_image pour ne pas passer par un fichier intermédiaire
    int main(int argc,char *argv[]) {
        FMOD_SYSTEM *system;
        FMOD_SOUND *sound;
        FMOD_RESULT result;
        FMOD_TAG tag;
        int numtags;
     
        SDL_Surface *wnd;
        const SDL_VideoInfo *videoInfo;
     
        // Init sdl
        SDL_Init(SDL_INIT_VIDEO);
        putenv("SDL_VIDEO_WINDOW_POS=10,30");
        videoInfo=SDL_GetVideoInfo();
        wnd=SDL_SetVideoMode(videoInfo->current_w-20,videoInfo->current_h-70,WNDP,SDL_HWSURFACE|SDL_DOUBLEBUF);
        SDL_WM_SetCaption("Test fmod+stb_image+sdl",NULL);
     
        // Init fmod
        FMOD_System_Create(&system);
        FMOD_System_Init(system,100,FMOD_INIT_NORMAL,NULL);
     
        FMOD_System_CreateSound(system,"music.mp3",FMOD_SOFTWARE|FMOD_2D|FMOD_CREATESTREAM|FMOD_OPENONLY,0,&sound);
        FMOD_Sound_GetNumTags(sound,&numtags,NULL);
        if(numtags) {
            if(FMOD_Sound_GetTag(sound,"APIC",0,&tag)!=FMOD_ERR_TAGNOTFOUND) {
                char *td=tag.data;
                stbi_uc *img;                        // Well, stbi_uc is just an unsigned char
                int x,y,comp,req_comp=STBI_rgb;
     
                while(*(++td));                     // Skip MIME msg
                ++td;                                // Skip content type
                while(*(++td));                     // Skip description
                td++;                                // td is now pointing to the first byte of jpeg img
     
                // Deflate and display jpg
                img=stbi_load_from_memory((stbi_uc *)td,tag.datalen-(td-(char *)tag.data),&x,&y,&comp,req_comp);
                displayImg(wnd,x,y,comp,img);
                free(img);
                }
            else {} // Traitement si tag absent
            }
        else {} // Traitement si no tag
        FMOD_Sound_Release(sound);
     
        FMOD_System_Close(system);
        FMOD_System_Release(system);
     
        SDL_Quit();
     
        return(0);
    }
    Pour stb_image, le lien est dans le code, c'est un .h il suffit de le renommer en .c
    Ne me tuez pas sur le fait que ce programme devait être agencé autrement, je le sais, c'est juste une version de test, écrite et testée en quelques heures....
    De plus, pour faire court, j'ai retiré tous les tests d'erreur....
    Et enfin, pour ceux qui déciderait de voir ce que ça donne, si, comme moi, vous avez demandé à votre compilateur le maximum de warning, vous allez vous en choper un paquet à cause de stb....

    A+

    Edgar;
    On écrit "J'ai tort" ; "tord" est la conjugaison du verbre "tordre" à la 3ème personne de l'indicatif présent

Discussions similaires

  1. Réponses: 4
    Dernier message: 19/10/2012, 13h01
  2. Comment récupérer le nom du fichier sans l'extension ?
    Par altahir007 dans le forum Langage
    Réponses: 16
    Dernier message: 13/11/2009, 13h20
  3. Comment récupérer le raccourci Ctrl F4
    Par stef02032000 dans le forum C++Builder
    Réponses: 3
    Dernier message: 21/05/2003, 15h53
  4. Comment récupérer le VK_TAB ?
    Par henderson dans le forum C++Builder
    Réponses: 5
    Dernier message: 11/12/2002, 11h32
  5. Comment récupérer une adresse MAC ?
    Par psau dans le forum Développement
    Réponses: 7
    Dernier message: 19/07/2002, 17h26

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