Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 28/04/2009, à 20:55

kevlar

[résolu]Quelles bibliothèques multimedia légères utiliser ?

Bonjour à tous ! smile
Dans le cadre de mon projet actuel, je vais avoir besoin d'utiliser des capacités multimédia. Ce projet est en C, utilise Gtk; Cependant, je souhaiterais rester en Gtk "minimum", donc ne pas utiliser l'API de Gstreamer, qui obligerait à installer Gnome pour l'utilisateur final.
Voici donc ma question : quelle API utiliser pour lire dans le programme des fichiers Wav, Mp3, OGG ?
Je souhaiterais passer par une API utilisant les bibliothèques installées par défaut sur la plupart des Linux (même si je sais que le MP3 pose un problème "philosophique").
En vous remerciant pour vos réponses. smile

Dernière modification par kevlar (Le 30/04/2009, à 17:09)

Hors ligne

#2 Le 28/04/2009, à 21:13

rniamo

Re : [résolu]Quelles bibliothèques multimedia légères utiliser ?

si c'est léger sdl_mixer suffit


< Quelques un des mes programmes  | Cuisine Facile (pour les gourmands) | Fast MVC for PHP >
        \   ^__^
         \  (o o)\_______
            (___)\            )\

Hors ligne

#3 Le 28/04/2009, à 22:52

kevlar

Re : [résolu]Quelles bibliothèques multimedia légères utiliser ?

merci, je vais y jeter un coup d'oeil. smile

Hors ligne

#4 Le 29/04/2009, à 13:33

kevlar

Re : [résolu]Quelles bibliothèques multimedia légères utiliser ?

Effectivement, SDL est (était) du beau travail ! J'ai trouvé une doc en français ici :
http://megastep.org/SDL/ ; je ne sais pas par contre si SDL peut maintenant lire autre chose que de l'audio Wav ...

En fait, c'est maintenant le cas : http://www.toutprogrammer.com/wiki/Mise_en_bouche_SDL c'est bien tout ça !
tongue

Voici d'ailleurs la DOC pour utiliser le MP3 : http://osdl.sourceforge.net/main/docume … audio.html

Dernière modification par kevlar (Le 29/04/2009, à 13:46)

Hors ligne

#5 Le 29/04/2009, à 16:08

obiwankennedy

Re : [résolu]Quelles bibliothèques multimedia légères utiliser ?

Ou tu as vu qu'il fallait installer gnome pour avoir gstreamer ? je fais tourner gstreamer sur des périphériques embarques qui seraient bien incapable de faire tourner gnome.

Dernière modification par obiwankennedy (Le 29/04/2009, à 18:53)


Dans mes logiciels, j'écris ton nom.
SGNGD: SvgGd is Not GD
Rolisteam

Hors ligne

#6 Le 29/04/2009, à 17:06

kevlar

Re : [résolu]Quelles bibliothèques multimedia légères utiliser ?

Ouah, alors bonne nouvelle, parceque via SDL, l'accès aux formats complexes est ... complexe.

Hors ligne

#7 Le 29/04/2009, à 19:09

Link31

Re : [résolu]Quelles bibliothèques multimedia légères utiliser ?

Personnellement, j'utilise le combo libsndfile+openal_soft. La libsndfile permet de lire un certain nombre de formats audio en utilisant la même API. Et openal_soft s'interface directement avec Alsa (ou OSS, Arts... si c'est vraiment nécessaire), tout en fournissant du son spatialisé, des effets audio comme l'echo, le doppler... (extensions EAX/EFX) et une API particulièrement facile à utiliser, basée sur celle d'OpenGL.

La libsndfile ne dépend que de certaines bibliothèques de décodage comme la libogg ou la libflac, et openal ne dépend de rien wink

Hors ligne

#8 Le 29/04/2009, à 19:28

kevlar

Re : [résolu]Quelles bibliothèques multimedia légères utiliser ?

encore une fois, Link31, merci pour tes infos ! Là, je souhaite juste "sonoriser" ; donc je cherche des biblios simple, légères, efficaces. Il ne s'agit pas du tout de faire du 5.1 ! lol

En fait, je cherche un peu à faire du 'light' comme dans 'alsa-player' (je pense que tu connais ...)

Dernière modification par kevlar (Le 29/04/2009, à 19:29)

Hors ligne

#9 Le 29/04/2009, à 19:35

kevlar

Re : [résolu]Quelles bibliothèques multimedia légères utiliser ?

par contre, l'auteur de libsndfile (pour des raisons que je comprends) ne supporte pas le MP3 ...

De même, le mainteneur de 'OPenAl'  donne un exemple de programme dans lequel il fait un appel système (excelp) dans lequel il invoque mplayer.

Ce que je cherche, c'est une bibio qui ferait (on peut toujours rêver ) ceci :

FILE *f;
int retour;

f= fopen("gagna.mp3")
retour = play_avec_la_super_api(f);

fclose(f);

Dernière modification par kevlar (Le 29/04/2009, à 19:45)

Hors ligne

#10 Le 29/04/2009, à 20:06

kevlar

Re : [résolu]Quelles bibliothèques multimedia légères utiliser ?

Bon, en fait SDL_mixer devrait le faire (tant pis pour le mp3)
bon tuto ici : http://www.cs.clemson.edu/~malloy/cours … audio.html
et si ! Libre, OpenSource, et capable de lire ce qui est le plus répandu ! audiere :
http://audiere.sourceforge.net/ ... pas dechance, c'est du C++

Dernière modification par kevlar (Le 29/04/2009, à 20:12)

Hors ligne

#11 Le 29/04/2009, à 23:15

rniamo

Re : [résolu]Quelles bibliothèques multimedia légères utiliser ?

perso avec sdl_mixer j'ai fait marcher du mp3, ogg etc ... j'ai plus le svn de monter mais t'as mes sources là : http://rniamo.is-a-geek.com/mu/2009/04/21/soundplayer/ :

voilà pour l'extrait :

#include <SDL/SDL.h>
#include <SDL/SDL_mixer.h>
#define TEMPS_PAUSE 30 

int initSDLAudio(void) {
	/* On initialise le son */
	if (SDL_Init(SDL_INIT_AUDIO)) {
		SDL_Quit();
		return -1;
	}

	/* On ouvre un device audio */
	if (Mix_OpenAudio(44100, MIX_DEFAULT_FORMAT, 2, 1024)<0) {
		SDL_Quit();
		return -1;
	}
	
	return 0;
}

void fermeSDLAudio(void) {
    	Mix_CloseAudio();
	SDL_Quit();
}

void lireFichierSDLMixeur(const char * fichier, Mix_Music **zik2) {
	Mix_Music *zik=NULL;
		
	if (Mix_PausedMusic()) { /* si la musique est en pause on la relance sinon on la met en pause */
		Mix_ResumeMusic();
	}
	else if (fichier) {		
		if (zik2 && *zik2)
			zik=*zik2;
		if (zik) {
	    		Mix_FreeMusic(zik);
			*zik2=NULL;
	    	}
		zik=Mix_LoadMUS(fichier);
		if (Mix_PlayMusic(zik,1)!=-1) {
			while (Mix_PlayingMusic())
	       			SDL_Delay(TEMPS_PAUSE); /* ms  */
	    		Mix_FreeMusic(zik);
	    		zik=NULL;
	    	}
    	}
}

void PauseSDLMixeur(void) {
		Mix_PauseMusic();
}

void stopSDLMixeur(void) {
	Mix_HaltMusic();
}

Dernière modification par rniamo (Le 29/04/2009, à 23:16)


< Quelques un des mes programmes  | Cuisine Facile (pour les gourmands) | Fast MVC for PHP >
        \   ^__^
         \  (o o)\_______
            (___)\            )\

Hors ligne

#12 Le 30/04/2009, à 11:03

kevlar

Re : [résolu]Quelles bibliothèques multimedia légères utiliser ?

merci pour ton exemple smile

Hors ligne

#13 Le 30/04/2009, à 15:12

kevlar

Re : [résolu]Quelles bibliothèques multimedia légères utiliser ?

encore une fois merci à toi ! J'ai indignement pompé ton code, et adapté ainsi :

/* compiler ainsi : gcc -g -o sdl sdl.c `sdl-config --cflags --libs` -lSDL_mixer
gcc -g -o sdl sdl.c `sdl-config --cflags --libs` -lSDL_mixer
 */
/* Mix_Music actually holds the music information.  */
#include <SDL/SDL.h>
#include <SDL/SDL_mixer.h>
#define TEMPS_PAUSE 30 

int initSDLAudio(void) {
    /* On initialise le son */
    if (SDL_Init(SDL_INIT_AUDIO)) {
        SDL_Quit();
        return -1;
    }

    /* On ouvre un device audio */
    if (Mix_OpenAudio(44100, MIX_DEFAULT_FORMAT, 2, 1024)<0) {
        SDL_Quit();
        return -1;
    }
    
    return 0;
}

void fermeSDLAudio(void) {
        Mix_CloseAudio();
    SDL_Quit();
}

void lireFichierSDLMixeur(const char * fichier, Mix_Music **zik2) {
    Mix_Music *zik=NULL;
        
    if (Mix_PausedMusic()) { /* si la musique est en pause on la relance sinon on la met en pause */
        Mix_ResumeMusic();
    }
    else if (fichier) {        
        if (zik2 && *zik2)
            zik=*zik2;
        if (zik) {
                Mix_FreeMusic(zik);
            *zik2=NULL;
            }
        zik=Mix_LoadMUS(fichier);
        if (Mix_PlayMusic(zik,1)!=-1) {
            while (Mix_PlayingMusic())
                       SDL_Delay(TEMPS_PAUSE); /* ms  */
                Mix_FreeMusic(zik);
                zik=NULL;
            }
        }
}

void PauseSDLMixeur(void) {
        Mix_PauseMusic();
}

void stopSDLMixeur(void) {
    Mix_HaltMusic();
}

int main()
{
 int retour;
 Mix_Music *music = NULL;

 retour = initSDLAudio();
 if (retour!=0)
   {
    printf("problème init \n");
    return -1;
   }
 lireFichierSDLMixeur("son.ogg", &music);
 usleep(15000);
 stopSDLMixeur();
 return 0;
}

Par contre, sur un michier MP, le son est hâché, pas à la bonne fréquence (je pense à un problème d'échantillonnage ... neutral)

Hors ligne

#14 Le 30/04/2009, à 17:00

kevlar

Re : [résolu]Quelles bibliothèques multimedia légères utiliser ?

ça marche ! Voici un code très simple qui lit pendant 5000 msec un fichier .mp3 qui se trouve, par défaut, dans le répertoire courant :

/* compiler ainsi : gcc -g -o sdl sdl.c `sdl-config --cflags --libs` -lSDL_mixer
gcc -g -o sdl sdl.c `sdl-config --cflags --libs` -lSDL_mixer
 */
/* Mix_Music actually holds the music information.  */
#include <SDL/SDL.h>
#include <SDL/SDL_mixer.h>

 int retour;

/* We're going to be requesting certain things from our audio
     device, so we set them up beforehand */
  int audio_rate = 22050;
  Uint16 audio_format = AUDIO_S16; /* 16-bit stereo */
  int audio_channels = 2;
  int audio_buffers = 4096;
  Mix_Music *music = NULL;
/*********************************
 initialise le serveur SDL
********************************/
int initSDLAudio(void) 
{
    /* On initialise le son */
    if (SDL_Init(SDL_INIT_AUDIO)) 
     {
        SDL_Quit();
        return -1;
     }

    if(Mix_OpenAudio(audio_rate, audio_format, audio_channels, audio_buffers)) 
     {
      printf("Unable to open audio!\n");
      return -1;
     }    
    return 0;
}
/***********************
***********************/
void fermeSDLAudio(void) 
{
    Mix_CloseAudio();
    SDL_Quit();
}
/*****************************
 lire un fichier sonore ;
 si OK, la lecture se fait en
 arrière plan
 Un test est fait pour arrêter 
 un son SDL en cours
******************************/
void lireFichierSDLMixeur(const char * fichier, Mix_Music **zik2) 
{
    Mix_Music *zik=NULL;        
    if (fichier) 
       {        
        if (zik2 && *zik2)
            zik=*zik2;
        if (zik) 
         {
            Mix_FreeMusic(zik);
            *zik2=NULL;
         }
        zik=Mix_LoadMUS(fichier);
        Mix_PlayMusic(zik, 0);/* est asynchrone ... c'est le délai après qui gère tout ! */
        SDL_Delay(50000);/* durée idiote, juste pour écouter la musique ! */
       }/* endif fichier */
}
/**************/
void PauseSDLMixeur(void) {
        Mix_PauseMusic();
}

/**********************
 arrêter son SDL
**********************/
void stopSDLMixeur(void) 
{
    Mix_HaltMusic();
}
/***********************/
int main()
{
 retour = initSDLAudio();
 if (retour!=0)
   {
    printf("problème init \n");
    return -1;
   }
 lireFichierSDLMixeur("son.mp3", &music);
 usleep(150000);
 stopSDLMixeur();
 fermeSDLAudio();
 return 0;
}
}

Allez, et un petit "résolu"  big_smile

Dernière modification par kevlar (Le 30/04/2009, à 17:20)

Hors ligne

#15 Le 30/04/2009, à 18:33

kevlar

Re : [résolu]Quelles bibliothèques multimedia légères utiliser ?

Finalement ce n'est pas résolu . Si je compile ainsi le fichier source nommé fp2c.c :

gcc `pkg-config --cflags gtk+-2.0 poppler-glib` `sdl-config --cflags` `pkg-config --libs gtk+-2.0 poppler-glib` `sdl-config --libs` -lSDL_mixer -o fp fp2c.c

le programme compile, il fonctionne pour la partie Gtk, Poppler, et pourtant aucun son n'est produit, alors mêmes que les initialisations de SDL sont faites (j'ai copié-collé le programme ci-dessus qui marche !!!)

Hors ligne

#16 Le 30/04/2009, à 20:32

kevlar

Re : [résolu]Quelles bibliothèques multimedia légères utiliser ?

Bon, cette fois ça marche ! smile
Bien se rappeler, pour ceux qui en auront besoin, qu'il faut mettre dans la dernière étape de la compilation (dans le makefile) l'option : -lSDL_mixer
Là, j'ai une chanson qui passe en arrière plan dans un programme perso qui est sensé faire tout à fait autre chose ... lol

Hors ligne