#1 Le 28/04/2009, à 20:55
- kevlar
[résolu]Quelles bibliothèques multimedia légères utiliser ?
Bonjour à tous !
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.
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.
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 !
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
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 !
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
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 ... )
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"
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 !
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 ...
Hors ligne