Utiliser Id3lib dans vos applications

Installer id3lib

La première étape pour utiliser id3lib est bien sûr de l’installer sur son systême. Pour de nombreuses distributions GNU/Linux, Il existe dans le gestionnaire de paquets, un paquet d’id3lib. Il est très important d’installer la bibliothèque ainsi que ses en-têtes (souvent un paquet avec un suffixe -dev ou -devel).

Sous Ubuntu 8.04:

sudo apt-get install libid3-3.8.3c2a libid3-3.8.3-dev

Sous fedora 9:

yum install id3lib-3.8.3-20.fc9 id3lib-devel-3.8.3-20.fc9

Bien sûr, vous pouvez compiler vous-même la bibliothèque. En téléchargeant le code source sur le site:

DownloadPour les utilisateurs de Windows, il existe deux possibilités:

Si vous utilisez Visual Studio, alors télécharger

ici

la version binaire de la bibliothèque. Ajoutez la, dans la liste des dépendences de votre projet et tout ira bien.

Si vous utilisez le compilateur libre mingw. Je vous conseille alors d’utiliser cette version de la bibliothèque. Sinon, il ne vous restera qu’à la compiler.

Compiler avec id3lib

Pour des environnements linux, il suffit d’installer la bibliothèque et d’ajouter

-lid3

à la ligne d’édition des liens.

Exemple d’un petit makefile:


all:main

main: main.o MP3_File.o
        g++ -Wall -g -o main main.o MP3_File.o -lid3

main.o: main.cpp
        g++ -Wall -g -c main.cpp

MP3_File.o:MP3_File.cpp MP3_File.h
        g++ -Wall -g -c MP3_File.cpp

Pour windows, le principe est le même.
Si vous utilisez visual studio. Modifier les paramètres de votre projet. Si vous utilisez mingw (gcc). Il sera surêment nécessaire de donner en paramètre l’emplacement de la bibliothèque et de ses en-têtes:"-I"lib\include".

Lire des tags

Dans ce chapitre, nous allons voir comment Id3lib doit être utilisé pour la lecture de tags. La bibliothèque est entièrement contrôlée par la classe

ID3_Tag

(Design pattern: Façade) L’initialisation commence par la création d’une instance

ID3_Tag

puis il faut la lier à un fichier mp3.


#include <id3/tag.h>

ID3_Tag mytag;
mytag.Link("chemin_du_mp3.mp3",ID3TT_ALL);
ID3_Frame* myFrame = NULL;
myFrame= myTag.Find(ID3FID_TITLE);
if(myFrame!=0)
{
	char* title = new char[1024];
	myframe->Field(ID3FN_TEXT).Get(title,1024);
	cout << title << endl;
}

Ensuite, nous déclarons un pointeur sur une

ID3_Frame

initialisé à NULL. Nous demandons le titre de mp3 par l’appel de la fonction Find(ID3_FrameID). Cette fonction prend en paramètre une valeur d’une énumération (pour connaitre toutes les valeurs de l’énumeration: voir

Id3lib API documentation

).

Si la frame n’est pas vide alors nous créons un tableau de caractères. Et nous demandons à la frame de remplir ce tableau avec le champs ID3FN_TEXT. Un tag correspond à une frame et une frame stocke l’information sous plusieurs formes. Ainsi il est évident que le titre est une donnée textuelle. Alors que le genre de musique est une valeur entière.

Écrire des tags

Il existe deux méthodes pour ajouter/modifier des tags. La première est l’inverse de la lecture. Elle nécessite la création et l’initialisation d’une

ID3_FRAME

puis l’ajout de cette frame à une instance de

ID3_Tag

. Cette méthode est longue et compliquée. C’est pourquoi, Id3lib fournit des méthodes plus simple d’utilisation


#include <id3/tag.h>
#include <id3/misc_support.h>


ID3_Tag mytag;
mytag.Link("chemin_du_mp3.mp3",ID3TT_ALL);
char* nouveautitre = new char[100];
sprintf(nouveautitre,"9eme symphonie");
ID3_AddTitle (&mytag, nouveautitre, true);
mytag->Update();

Comme toujours, vous devez créer et initialiser une instance de

ID3_Tag

. Puis, faite appel à la fonction ID3_AddTitle(). Cette fonction prend 3 paramètres: un pointeur sur un

ID3_Tag

pour identifier quel fichier doit être modifié, un tableau de caractères contenant la nouvelle valeur et un booléen, true pour écraser si le tag existe déja et false pour ne rien faire si le tag existe déja.

Accès aux headers

Certaines informations comme le “bitrate” et la durée du mp3 ne sont pas contenu dans des frames. Il existe bien une frame “Time” mais elle est rarement remplie. Ainsi, il vaut mieux utiliser les informations calculées dans les headers. Elles sont plus justes. Voici la liste des 4 champs principaux d’une instance Mp3_Headerinfo:


bitrate = m_mp3header->bitrate;
bitrate_si_variable = m_mp3header->vbr_bitrate;
frequence = m_mp3header->frequency;
durée   = m_mp3header->time;

Un petit exemple pour récupérer le bitrate.


#include <id3/tag.h>
ID3_Tag* mytag = new ID3_Tag;
mytag->Link("chemin_du_mp3.mp3",ID3TT_ALL);
Mp3_Headerinfo* header = mytag->GetMp3HeaderInfo();

if((header != NULL)&&(header->bitrate>0))
fields->Bitrate = header->bitrate;
else if(header != NULL)
fields->Bitrate = header->vbr_bitrate;

Il existe d’autres champs. Voici un exemple de transformation de ces champs en données lisible pour l’homme.


szMpegLayer = new char[10];
//MPEG layer
switch(m_mp3header->layer)
{
case MPEGLAYER_UNDEFINED: sprintf(szMpegLayer, "UNDEFINED"); break;
case MPEGLAYER_III:       sprintf(szMpegLayer, "Layer III"); break;
case MPEGLAYER_II:        sprintf(szMpegLayer, "Layer II");  break;
case MPEGLAYER_I:         sprintf(szMpegLayer, "Layer I");   break;
default:                  szMpegLayer = 0;
}

// MPEG Version 
szMpegVersion = new char[10];
switch(m_mp3header->version)
{
case MPEGVERSION_2_5: sprintf(szMpegVersion, "MPEG 2.5"); break;
case MPEGVERSION_2:   sprintf(szMpegVersion, "MPEG 2");   break;
case MPEGVERSION_1:   sprintf(szMpegVersion, "MPEG 1");   break;
default:              szMpegVersion = 0;
}

// Channel Mode
szChannelMode = new char[15];
switch(m_mp3header->channelmode)
{
case MP3CHANNELMODE_STEREO:         sprintf(szChannelMode, "Stereo");         break;
case MP3CHANNELMODE_JOINT_STEREO:   sprintf(szChannelMode, "Joint Stereo");   break;
case MP3CHANNELMODE_DUAL_CHANNEL:   sprintf(szChannelMode, "Dual Channel");   break;
case MP3CHANNELMODE_SINGLE_CHANNEL: sprintf(szChannelMode, "Single Channel"); break;
default:                            szChannelMode = 0;
}

Conclusion

Ce tutorial vous a montré comment utiliser la bibliothèque

id3lib

. Ce tutorial ne couvre bien sûr pas toutes les fonctionnées que peut fournir cette bibliothèque. N’hesiter pas à consulter le code source (et surtout les fichiers .h) d’id3lib pour l’utiliser au mieux.

La documention d’id3lib est dépassée mais elle peut vous être utile, notament les différents manuels.

En ce qui conserne les exemples de ce tutorial, c’est t’a vous de créer l’architecture de votre application et d’intégrer les exemples au bon endroit.

(renseignez vous sur le design pattern : adapter)

Leave a Reply

Your email address will not be published. Required fields are marked *