bonjour à tous,
voila je suis en train de realiser un paquage gerant les données audio.
Dans ce package, je souhaite proposer plusieurs moyens de lire les tags ID3 des mp3 et notamment un lecteur binaire qui les recupère depuis les entetes du fichiers. Celui ci fonctionne presque à l'exception des entêtes définies par l'utilisateur (frames mentionnées TXXX). En effet, au lieu d'avoir comme pour les entetes ID3 classiques IDframe => valeur on a TXXX=>valeur, avec valeur l'identifiant de la frame définie par l'utilisateur une chaine contenant l'identifiant de la frame et sa valeur.
Il faut donc que je parse le contenu de ses valeurs binaires.
J'arrive bien a récupérer le contenu de la frame, mais je n'arrive pas a parser le contenu car il semblerait que certains caractères soient interprétés par PHP malgré une valeur hexadecimale différente.
Un exemple sera surement plus parlant:
ce qui me donne en sortie pour l'analyse d'un mp3 en recherchant la valeur d'une frame definie par l'utilisateur s'appelant "MusicBrainz Album Id":
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 /** * look in user defined frames for a string * @param string $frameName the related frame name * @return Audio_Tags_Value */ private function _lookInUserDefinedFrames ($frameName) { // ID3 tags content is set in UTF16, so setting the frameName to look for in value in UTF16 $frameName = mb_convert_encoding($frameName, "UTF16"); // if key has not yet been found... if (!array_key_exists($frameName, $this->_frameCache)) { $value = null; // look inside the user defined frames for $frameName by parsing values foreach ($this->_tags->getUsersDefinedFrames() as $currentValue) { // $currentValue = trim($currentValue); echo "-----------------------------------".PHP_EOL; echo "frame: ". bin2hex($frameName).PHP_EOL; echo "value: ". bin2hex($currentValue).PHP_EOL; echo "testing '$currentValue' for $frameName".PHP_EOL; if (mb_strpos(bin2hex($currentValue), bin2hex($frameName))!==false) { echo "found!!!!!!!!!!!!".PHP_EOL; $value = trim(mb_substr($currentValue, strlen($frameName))); break; } ELSE { echo "not found".PHP_EOL; } } // save it in cache $this->_frameCache[$frameName] = new Audio_Tags_Value($value); } return (array_key_exists($frameName, $this->_frameCache) ? $this->_frameCache[$frameName] : null); }
si on regarde la comparaison du contenu de la frame encodée en UTF16 avec la valeur, on voit que toute la valeur est identique, à l'exception du premier caractère:
Code x : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 ... ----------------------------------- frame: 004d00750073006900630042007200610069006e007a0020004100720074006900730074002000490064 value: fe4d00750073006900630042007200610069006e007a0020004100720074006900730074002000490064000000fffe360035006600340066003000630035002d0065006600390065002d0034003900300063002d0061006500650033002d003900300039006500370061006500360062003200610062 testing '�MusicBrainz Artist Id��65f4f0c5-ef9e-490c-aee3-909e7ae6b2ab' for MusicBrainz Artist Id not found ...
dans la frameValue recherchée, j'ai 004d qui correspond bien à un "M" alors que dans la valeur j'ai fe4d qui correspond selon http://www.fileformat.info a un "_". Or PHP m'affiche bien un M (précédé d'un caractère bizarre).
J'ai bien essayé de reduire la taille des données obtenues lors du parsing des frames pour supprimer ce caractère bizarre en debut de chaine. dans ce cas, cela me donne:
4d00 ne represente pas un caractère unicode valide. du coup, php complète t'il la structure de la chaine pour l'affichage? et du coup, auriez vous une idée sur la facon dont je pourrais tester réellement l'existence de la frame et récupérer sa valeur?
Code x : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 ----------------------------------- frame: 004d00750073006900630042007200610069006e007a0020004100720074006900730074002000490064 value: 4d00750073006900630042007200610069006e007a0020004100720074006900730074002000490064000000fffe360035006600340066003000630035002d0065006600390065002d0034003900300063002d0061006500650033002d00390030003900650037006100650036006200320061006200 testing 'MusicBrainz Artist Id��65f4f0c5-ef9e-490c-aee3-909e7ae6b2ab' for MusicBrainz Artist Id not found
Tout aide me sera utile.
Cordialement,
Partager