{"id":11,"date":"2008-07-01T13:37:18","date_gmt":"2008-07-01T13:37:18","guid":{"rendered":"http:\/\/liberty.fdn.fr\/?p=11"},"modified":"2025-08-17T20:13:53","modified_gmt":"2025-08-17T20:13:53","slug":"utiliser-id3lib-dans-vos-applications","status":"publish","type":"post","link":"http:\/\/renaudguezennec.eu\/index.php\/2008\/07\/01\/utiliser-id3lib-dans-vos-applications\/","title":{"rendered":"Utiliser Id3lib dans vos applications"},"content":{"rendered":"<h2>Installer id3lib<\/h2>\n<p class=\"readability-styled\">La premi\u00e8re \u00e9tape pour utiliser id3lib est bien s\u00fbr de l&#8217;installer sur son syst\u00eame. Pour de nombreuses distributions GNU\/Linux, Il existe dans le gestionnaire de paquets, un paquet d&#8217;id3lib. Il est tr\u00e8s important d&#8217;installer la biblioth\u00e8que ainsi que ses en-t\u00eates (souvent un paquet avec un suffixe -dev ou -devel).<\/p>\n<p>Sous Ubuntu 8.04:<\/p>\n<pre class=\"code\"><code>sudo apt-get install libid3-3.8.3c2a libid3-3.8.3-dev<\/code><\/pre>\n<p>Sous fedora 9:<\/p>\n<pre class=\"code\"><code>yum install id3lib-3.8.3-20.fc9 id3lib-devel-3.8.3-20.fc9<\/code><\/pre>\n<p class=\"readability-styled\">Bien s\u00fbr, vous pouvez compiler vous-m\u00eame la biblioth\u00e8que. En t\u00e9l\u00e9chargeant le code source sur le site:<\/p>\n<p><a href=\"http:\/\/sourceforge.net\/project\/showfiles.php?group_id=979\">Download<\/a><span class=\"gras\">Pour les utilisateurs de Windows<\/span>, il existe deux possibilit\u00e9s:<\/p>\n<p class=\"readability-styled\">Si vous utilisez Visual Studio, alors t\u00e9l\u00e9charger<\/p>\n<p><a href=\"http:\/\/sourceforge.net\/project\/showfiles.php?group_id=979\">ici<\/a><\/p>\n<p class=\"readability-styled\">la version binaire de la biblioth\u00e8que. Ajoutez la, dans la liste des d\u00e9pendences de votre projet et tout ira bien.<\/p>\n<p>Si vous utilisez le compilateur libre mingw. Je vous conseille alors d&#8217;utiliser cette <a href=\"http:\/\/renaudguezennec.eu\/prog\/tutorial\/9\/id3lib-3.8.3-gcc3.4.2-mingw.zip\">version<\/a> de la biblioth\u00e8que. Sinon, il ne vous restera qu&#8217;\u00e0 la compiler.<\/p>\n<div class=\"article\" lang=\"fr\">\n<p><a name=\"Compile\"><\/a><\/p>\n<h2>Compiler avec id3lib<\/h2>\n<p class=\"readability-styled\">Pour des environnements linux, il suffit d&#8217;installer la biblioth\u00e8que et d&#8217;ajouter<\/p>\n<p><code class=\"filename\">-lid3<\/code><\/p>\n<p class=\"readability-styled\">\u00e0 la ligne d&#8217;\u00e9dition des liens.<\/p>\n<p class=\"readability-styled\">Exemple d&#8217;un petit makefile:<\/p>\n<pre class=\"code\"><code>\r\nall:main\r\n\r\nmain: main.o MP3_File.o\r\n        g++ -Wall -g -o main main.o MP3_File.o -lid3\r\n\r\nmain.o: main.cpp\r\n        g++ -Wall -g -c main.cpp\r\n\r\nMP3_File.o:MP3_File.cpp MP3_File.h\r\n        g++ -Wall -g -c MP3_File.cpp\r\n<\/code><\/pre>\n<p>Pour windows, le principe est le m\u00eame.<br \/>\nSi vous utilisez visual studio. Modifier les param\u00e8tres de votre projet. Si vous utilisez mingw (gcc). Il sera sur\u00eament n\u00e9cessaire de donner en param\u00e8tre l&#8217;emplacement de la biblioth\u00e8que et de ses en-t\u00eates:<code class=\"filename\">\"-I\"lib\\include\"<\/code>.<\/p>\n<\/div>\n<div class=\"article\" lang=\"fr\">\n<p><a name=\"Lire\"><\/a><\/p>\n<h2>Lire des tags<\/h2>\n<p class=\"readability-styled\">Dans ce chapitre, nous allons voir comment Id3lib doit \u00eatre utilis\u00e9 pour la lecture de tags. La biblioth\u00e8que est enti\u00e8rement contr\u00f4l\u00e9e par la classe<\/p>\n<p><code class=\"filename\">ID3_Tag<\/code><\/p>\n<p class=\"readability-styled\">(Design pattern: Fa\u00e7ade) L&#8217;initialisation commence par la cr\u00e9ation d&#8217;une instance<\/p>\n<p><code class=\"filename\">ID3_Tag<\/code><\/p>\n<p class=\"readability-styled\">puis il faut la lier \u00e0 un fichier mp3.<\/p>\n<pre class=\"code\"><code>\r\n#include &lt;id3\/tag.h&gt;\r\n\r\nID3_Tag mytag;\r\nmytag.Link(\"chemin_du_mp3.mp3\",ID3TT_ALL);\r\nID3_Frame* myFrame = NULL;\r\nmyFrame= myTag.Find(ID3FID_TITLE);\r\nif(myFrame!=0)\r\n{\r\n\tchar* title = new char[1024];\r\n\tmyframe-&gt;Field(ID3FN_TEXT).Get(title,1024);\r\n\tcout &lt;&lt; title &lt;&lt; endl;\r\n}\r\n\r\n<\/code><\/pre>\n<p class=\"readability-styled\">Ensuite, nous d\u00e9clarons un pointeur sur une<\/p>\n<p><code class=\"filename\">ID3_Frame<\/code><\/p>\n<p class=\"readability-styled\">initialis\u00e9 \u00e0 NULL. Nous demandons le titre de mp3 par l&#8217;appel de la fonction Find(ID3_FrameID). Cette fonction prend en param\u00e8tre une valeur d&#8217;une \u00e9num\u00e9ration (pour connaitre toutes les valeurs de l&#8217;\u00e9numeration: voir<\/p>\n<p><a href=\"http:\/\/id3lib.sourceforge.net\/api\/globals_8h.html\">Id3lib API documentation<\/a><\/p>\n<p class=\"readability-styled\">).<\/p>\n<p class=\"readability-styled\">Si la frame n&#8217;est pas vide alors nous cr\u00e9ons un tableau de caract\u00e8res. Et nous demandons \u00e0 la frame de remplir ce tableau avec le champs ID3FN_TEXT. Un tag correspond \u00e0 une frame et une frame stocke l&#8217;information sous plusieurs formes. Ainsi il est \u00e9vident que le titre est une donn\u00e9e textuelle. Alors que le genre de musique est une valeur enti\u00e8re.<\/p>\n<\/div>\n<div class=\"article\" lang=\"fr\">\n<p><a name=\"ecrire\"><\/a><\/p>\n<h2>\u00c9crire des tags<\/h2>\n<p class=\"readability-styled\">Il existe deux m\u00e9thodes pour ajouter\/modifier des tags. La premi\u00e8re est l&#8217;inverse de la lecture. Elle n\u00e9cessite la cr\u00e9ation et l&#8217;initialisation d&#8217;une<\/p>\n<p><code class=\"filename\">ID3_FRAME<\/code><\/p>\n<p class=\"readability-styled\">puis l&#8217;ajout de cette frame \u00e0 une instance de<\/p>\n<p><code class=\"filename\">ID3_Tag<\/code><\/p>\n<p class=\"readability-styled\">. Cette m\u00e9thode est longue et compliqu\u00e9e. C&#8217;est pourquoi, Id3lib fournit des m\u00e9thodes plus simple d&#8217;utilisation<\/p>\n<pre class=\"code\"><code>\r\n#include &lt;id3\/tag.h&gt;\r\n#include &lt;id3\/misc_support.h&gt;\r\n\r\n\r\nID3_Tag mytag;\r\nmytag.Link(\"chemin_du_mp3.mp3\",ID3TT_ALL);\r\nchar* nouveautitre = new char[100];\r\nsprintf(nouveautitre,\"9eme symphonie\");\r\nID3_AddTitle (&amp;mytag, nouveautitre, true);\r\nmytag-&gt;Update();\r\n<\/code><\/pre>\n<p class=\"readability-styled\">Comme toujours, vous devez cr\u00e9er et initialiser une instance de<\/p>\n<p><code class=\"filename\">ID3_Tag<\/code><\/p>\n<p class=\"readability-styled\">. Puis, faite appel \u00e0 la fonction ID3_AddTitle(). Cette fonction prend 3 param\u00e8tres: un pointeur sur un<\/p>\n<p><code class=\"filename\">ID3_Tag<\/code><\/p>\n<p class=\"readability-styled\">pour identifier quel fichier doit \u00eatre modifi\u00e9, un tableau de caract\u00e8res contenant la nouvelle valeur et un bool\u00e9en, true pour \u00e9craser si le tag existe d\u00e9ja et false pour ne rien faire si le tag existe d\u00e9ja.<\/p>\n<div>\n<div class=\"article\" lang=\"fr\">\n<p><a name=\"headers\"><\/a><\/p>\n<h2>Acc\u00e8s aux headers<\/h2>\n<p class=\"readability-styled\">Certaines informations comme le &#8220;bitrate&#8221; et la dur\u00e9e du mp3 ne sont pas contenu dans des frames. Il existe bien une frame &#8220;Time&#8221; mais elle est rarement remplie. Ainsi, il vaut mieux utiliser les informations calcul\u00e9es dans les headers. Elles sont plus justes. Voici la liste des 4 champs principaux d&#8217;une instance Mp3_Headerinfo:<\/p>\n<pre class=\"code\"><code>\r\nbitrate = m_mp3header-&gt;bitrate;\r\nbitrate_si_variable = m_mp3header-&gt;vbr_bitrate;\r\nfrequence = m_mp3header-&gt;frequency;\r\ndur\u00e9e   = m_mp3header-&gt;time;\r\n<\/code><\/pre>\n<p class=\"readability-styled\">Un petit exemple pour r\u00e9cup\u00e9rer le bitrate.<\/p>\n<pre class=\"code\"><code>\r\n#include &lt;id3\/tag.h&gt;\r\nID3_Tag* mytag = new ID3_Tag;\r\nmytag-&gt;Link(\"chemin_du_mp3.mp3\",ID3TT_ALL);\r\nMp3_Headerinfo* header = mytag-&gt;GetMp3HeaderInfo();\r\n\r\nif((header != NULL)&amp;&amp;(header-&gt;bitrate&gt;0))\r\nfields-&gt;Bitrate = header-&gt;bitrate;\r\nelse if(header != NULL)\r\nfields-&gt;Bitrate = header-&gt;vbr_bitrate;\r\n<\/code><\/pre>\n<p class=\"readability-styled\">Il existe d&#8217;autres champs. Voici un exemple de transformation de ces champs en donn\u00e9es lisible pour l&#8217;homme.<\/p>\n<pre class=\"code\"><code>\r\nszMpegLayer = new char[10];\r\n\/\/MPEG layer\r\nswitch(m_mp3header-&gt;layer)\r\n{\r\ncase MPEGLAYER_UNDEFINED: sprintf(szMpegLayer, \"UNDEFINED\"); break;\r\ncase MPEGLAYER_III:       sprintf(szMpegLayer, \"Layer III\"); break;\r\ncase MPEGLAYER_II:        sprintf(szMpegLayer, \"Layer II\");  break;\r\ncase MPEGLAYER_I:         sprintf(szMpegLayer, \"Layer I\");   break;\r\ndefault:                  szMpegLayer = 0;\r\n}\r\n\r\n\/\/ MPEG Version \r\nszMpegVersion = new char[10];\r\nswitch(m_mp3header-&gt;version)\r\n{\r\ncase MPEGVERSION_2_5: sprintf(szMpegVersion, \"MPEG 2.5\"); break;\r\ncase MPEGVERSION_2:   sprintf(szMpegVersion, \"MPEG 2\");   break;\r\ncase MPEGVERSION_1:   sprintf(szMpegVersion, \"MPEG 1\");   break;\r\ndefault:              szMpegVersion = 0;\r\n}\r\n\r\n\/\/ Channel Mode\r\nszChannelMode = new char[15];\r\nswitch(m_mp3header-&gt;channelmode)\r\n{\r\ncase MP3CHANNELMODE_STEREO:         sprintf(szChannelMode, \"Stereo\");         break;\r\ncase MP3CHANNELMODE_JOINT_STEREO:   sprintf(szChannelMode, \"Joint Stereo\");   break;\r\ncase MP3CHANNELMODE_DUAL_CHANNEL:   sprintf(szChannelMode, \"Dual Channel\");   break;\r\ncase MP3CHANNELMODE_SINGLE_CHANNEL: sprintf(szChannelMode, \"Single Channel\"); break;\r\ndefault:                            szChannelMode = 0;\r\n}\r\n<\/code><\/pre>\n<\/div>\n<div>\n<h2><a name=\"conclusion\"><\/a>Conclusion<\/h2>\n<p class=\"readability-styled\">Ce tutorial vous a montr\u00e9 comment utiliser la biblioth\u00e8que<\/p>\n<p><a href=\"http:\/\/id3lib.sourceforge.net\/\">id3lib<\/a><\/p>\n<p class=\"readability-styled\">. Ce tutorial ne couvre bien s\u00fbr pas toutes les fonctionn\u00e9es que peut fournir cette biblioth\u00e8que. N&#8217;hesiter pas \u00e0 consulter le code source (et surtout les fichiers .h) d&#8217;id3lib pour l&#8217;utiliser au mieux.<\/p>\n<p class=\"readability-styled\">La documention d&#8217;id3lib est d\u00e9pass\u00e9e mais elle peut vous \u00eatre utile, notament les diff\u00e9rents manuels.<\/p>\n<p class=\"readability-styled\">En ce qui conserne les exemples de ce tutorial, c&#8217;est t&#8217;a vous de cr\u00e9er l&#8217;architecture de votre application et d&#8217;int\u00e9grer les exemples au bon endroit.<\/p>\n<p class=\"readability-styled\">(renseignez vous sur le design pattern : adapter)<\/p>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Installer id3lib La premi\u00e8re \u00e9tape pour utiliser id3lib est bien s\u00fbr de l&#8217;installer sur son syst\u00eame. Pour de nombreuses distributions GNU\/Linux, Il existe dans le gestionnaire de paquets, un paquet d&#8217;id3lib. Il est tr\u00e8s important d&#8217;installer la biblioth\u00e8que ainsi que ses en-t\u00eates (souvent un paquet avec un suffixe -dev ou -devel). Sous Ubuntu 8.04: sudo [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_import_markdown_pro_load_document_selector":0,"_import_markdown_pro_submit_text_textarea":"","footnotes":""},"categories":[80,23],"tags":[],"class_list":["post-11","post","type-post","status-publish","format-standard","hentry","category-fr","category-tutorial"],"_links":{"self":[{"href":"http:\/\/renaudguezennec.eu\/index.php\/wp-json\/wp\/v2\/posts\/11","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/renaudguezennec.eu\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/renaudguezennec.eu\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/renaudguezennec.eu\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/renaudguezennec.eu\/index.php\/wp-json\/wp\/v2\/comments?post=11"}],"version-history":[{"count":1,"href":"http:\/\/renaudguezennec.eu\/index.php\/wp-json\/wp\/v2\/posts\/11\/revisions"}],"predecessor-version":[{"id":12,"href":"http:\/\/renaudguezennec.eu\/index.php\/wp-json\/wp\/v2\/posts\/11\/revisions\/12"}],"wp:attachment":[{"href":"http:\/\/renaudguezennec.eu\/index.php\/wp-json\/wp\/v2\/media?parent=11"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/renaudguezennec.eu\/index.php\/wp-json\/wp\/v2\/categories?post=11"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/renaudguezennec.eu\/index.php\/wp-json\/wp\/v2\/tags?post=11"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}