Utilisation d'AVAudioPlayer avec un fichier plist

Babyfoot34Babyfoot34 Membre
septembre 2010 modifié dans API AppKit #1
Bonjour a tous

Je n'arrive pas a passer ma valeur contenue dans mon fichier plist et dans un NSDictionary (qui est bien rempli puisque je le controle avec la console). Je me doute que cela doit etre ridicule mais je debute compleyement dans la prog. Alors soyez indulgent SVP.

Voici mon code

#import &quot;FirstViewController.h&quot;<br />#import &lt;AVFoundation/AVFoundation.h&gt;<br /><br /><br />@implementation FirstViewController<br /><br />@synthesize Ecouter, audioPlayer;<br />@synthesize path, Mots, dict;<br /><br />int lectureOn =0;<br /><br />- (IBAction)Ecouter: (id) sender{<br />	<br />	//Chemin de fichier (plist) ou se trouvent les données<br />	path = [[NSBundle mainBundle] pathForResource:@&quot;Data&quot; ofType:@&quot;plist&quot;]; <br />	<br />	NSLog(@&quot;Chemin du Plist: %@&quot;, path);<br />	<br />	NSError *error;<br />	<br />	//Remplissage du tableau avec les donnée du fichier plist<br />	dict = [[NSDictionary alloc] initWithContentsOfFile:path];<br />		<br />		if (dict == nil)<br />			NSLog(@&quot;Tableau vide&quot;, [error description]);<br />		else<br />			<br />			//NSDictionary *dictionary = [NSDictionary dictionaryWithObjects:objects forKeys:keys];<br />	<br />				for (id key in dict) {<br />					NSLog(@&quot;key: %@, value: %@&quot;, key, [dict objectForKey:key]);<br />				}<br />	<br />	audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL: /*[b]*/[dict objectForKey:key]];/*[/b]*/<br />	//	audioPlayer.numberOfLoops = -1;<br />	<br />		if (audioPlayer == nil)<br />			NSLog(@&quot;Erreur :&quot;, [error description]);<br />		else<br />			[audioPlayer play];	<br />			lectureOn =1;<br />	<br />	}<br />


J'ai mis en gras ce que je n'arrive pas a trouver (c.a.d le contenue de mon premier champs dans mon NSDictionary qui est le nom de mon fichier mp3 soit exemple.mp3)

Merci pour votre aide


[EDIT modo]Pense à  utiliser la balise [tt][co[/tt][tt]de]...[/co[/tt][tt]de][/tt] quand tu rédiges ton message (ou le bouton "#" au dessus des smileys et de la zone de texte où tu tapes ton message) pour une meilleure lisibilité du code

Réponses

  • AliGatorAliGator Membre, Modérateur
    17:03 modifié #2
    Heu je comprends pas trop, tu appelles [tt][dict objectForKKey:key][/tt] mais la variable "key", qui est sensée vu, ton utilisation, contenir le nom (NSString) de la clé à  récupérer dans ton NSDictionary... bah cette variable n'est pas définie !

    Bien sûr tu as un [tt]for(id key in dict)[/tt] mais qui déclare "key" (comme "id") que dans le scope de la boucle "for". D'ailleurs le compilateur du coup devrait te remonter une erreur genre "unknown variable key" après ta boucle for quand tu utilises [tt][dict objectForKey:key][/tt] puisqu'une fois la boucle for terminée, la variable "key" n'est plus dans le 'scope' donc n'est plus déclarée... (s'il ne te met pas d'erreur de compilation c'est bizarre)

    Remplace 'key' dans ton [tt][dict objectForKey:key][/tt] par la vraie clée, la NSString quoi, genre [tt]@mp3file[/tt] ou je ne sais quoi
  • Babyfoot34Babyfoot34 Membre
    septembre 2010 modifié #3
    Merci Aligator mais je n'ai pas de problemes avec key (malgres le fait que je n'ai effectivement pas declaré cet variable ni dans mon .h ni dans mon .m) Ne me demande pas pourquoi ? je n'en sait rien par contre tu peux voire que cela fonctionne tres bien :

    Je te donne un appercu de se qui apparait dans la console

    <br />2010-09-09 14:09:32.684 test2[46576:207] key: Item 1, value: {<br />&nbsp; &nbsp; &quot;Audio_Fr&quot; = &quot;jamais.mp3&quot;;<br />&nbsp; &nbsp; &quot;Audio_Ru&quot; = &quot;&quot;;<br />&nbsp; &nbsp; &quot;Mot_Fr&quot; = Jamais;<br />&nbsp; &nbsp; &quot;Mot_Ru&quot; = &quot;&#092;U041d&#092;U0438&#092;U043a&#092;U043e&#092;U0433&#092;U0434&#092;U0430&quot;;<br />}<br />2010-09-09 14:09:32.685 test2[46576:207] key: Item 2, value: {<br />&nbsp; &nbsp; &quot;Audio_Fr&quot; = &quot;souvent.mp3&quot;;<br />&nbsp; &nbsp; &quot;Audio_Ru&quot; = &quot;&quot;;<br />&nbsp; &nbsp; &quot;Mot_Fr&quot; = Souvent;<br />&nbsp; &nbsp; &quot;Mot_Ru&quot; = &quot;&#092;U0427&#092;U0430&#092;U0441&#092;U0442&#092;U043e&quot;;<br />}<br />2010-09-09 14:09:32.685 test2[46576:207] key: Item 3, value: {<br />&nbsp; &nbsp; &quot;Audio_Fr&quot; = &quot;rarement.mp3&quot;;<br />&nbsp; &nbsp; &quot;Audio_Ru&quot; = &quot;&quot;;<br />&nbsp; &nbsp; &quot;Mot_Fr&quot; = Rarement;<br />&nbsp; &nbsp; &quot;Mot_Ru&quot; = &quot;&#092;U0420&#092;U0435&#092;U0434&#092;U043a&#092;U043e&quot;;<br />}<br />2010-09-09 14:09:32.685 test2[46576:207] key: Item 0, value: {<br />&nbsp; &nbsp; &quot;Audio_Fr&quot; = &quot;possible.mp3&quot;;<br />&nbsp; &nbsp; &quot;Audio_Ru&quot; = &quot;&quot;;<br />&nbsp; &nbsp; &quot;Mot_Fr&quot; = Possible;<br />&nbsp; &nbsp; &quot;Mot_Ru&quot; = &quot;&#092;U0412&#092;U043e&#092;U0437&#092;U043c&#092;U043e&#092;U0436&#092;U043d&#092;U043e&#092;U0435&quot;;<br />}<br />
    


    J'ai un autre probleme (comme tu peux le voire) avec les caracteres en cyrilique. ils sont tres bien affichés dans le plist mais pas du tout compris par le NSDictionary

    Ceci etant dit, mon but est de pouvoir lire le fichier contenu dans "audio_fr" lorsque je clique sur mon bouton.

    Il y a une centaine de fichiers mp3 a lire c'est pour cette raison que je cherche une solution avec un tableau ou un dictionnaire pour pouvoir conserver la meme vue pendant toute la lecture du fichier plist

    J'espere etre assez claire (mais la c'est pas gagner) je sais

    Merci quand meme pour vos post

    Christophe
  • Babyfoot34Babyfoot34 Membre
    17:03 modifié #4
    Je reviens apres quelques heures de recherche (bon mais je crois avoir avancer grace a certain post d'Aligator)

    voila le code refait et un peu corriger mais je ne comprend pas les 2 warning

    merci pour votre aide

    [code/]

    - (IBAction)Ecouter: (id) sender{

    //Chemin de fichier (plist) ou se trouvent les données
    path = [[NSBundle mainBundle] pathForResource:@Data ofType:@plist];

    //Remplissage du tableau avec les donnée du fichier plist
    dict = [[NSDictionary alloc] initWithContentsOfFile:path];
    //NSString *valeur = [[dict objectForKey:1] valueForKey:@Audio_Fr];
    NSDictionary *fiche_2 = [dict objectForKey:1]; // le 1er c'est 0, le 2e c'est 1
    NSString *valeur = [fiche_2 valueForKey:@Audio_Fr];

    //Boucle pour afficher mes valeurs dans la console
    for (id key in dict) {
    NSLog(@key: %@, value: %@", key, [dict objectForKey:key]);
    }

    audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:valeur]  error:NULL];
    [audioPlayer play];
    lectureOn =1;
    }

    [code/]

  • Babyfoot34Babyfoot34 Membre
    17:03 modifié #5
    Ha les warning sont sur les lignes

    NSDictionary *fiche_2 = [dict objectForKey:1];
    warning: passing argument 1 of 'objectForKey:' makes pointer from integer without a cast

    et


    audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:valeur]  error:NULL];
    warning: local declaration of 'valeur' hides instance variable

  • AliGatorAliGator Membre, Modérateur
    17:03 modifié #6
    dans 1284031253:

    Merci Aligator mais je n'ai pas de problemes avec key (malgres le fait que je n'ai effectivement pas declaré cet variable ni dans mon .h ni dans mon .m) Ne me demande pas pourquoi ? je n'en sait rien par contre tu peux voire que cela fonctionne tres bien :
    Bah non là  ce que tu affiches c'est ce qui est affiché par la boucle [tt]for(id key in dict)[/tt] avec le NSLog dans cette boucle. Et elle c'est normal qu'elle fonctionne, elle boucle sur toutes les clés et te les affiche une par une, donc ce que tu as dans la console de ce côté est normal (bon d'ailleurs pour info tu pourrais tout aussi bien faire un [tt]NSLog(@dict: %@" , dict)[/tt] si tu veux afficher le contenu de ton dictionary c'est plus simple)

    Donc ça aucun problème.
    C'est le [tt]objectForKey[/tt] que tu as mis APRES la fin de la boucle for qui n'était pas normal, c'est un peu comme si tu mettais [tt][dict objectForKey: ploufplouf][/tt] mais que tu n'as jamais défini ce qu'était ploufplouf. Dans ce cas tu devrais avoir une erreur de compilation, si tu n'en as pas soit c'est qu'il y a un bug dans le compilateur qui laisse passer ça alors qu'il ne devrait pas, soit c'est que tu n'as pas recopié exactement ton code comme tu l'as dans ton .m... Car pour le coup d'après le code de ton premier post, "key" n'est plus déclaré/défini à  ce moment là , et même si sa déclaration qui a été faite dans le "for" avant était par hasard encore considérée comme valable par le compilateur, on se demande bien quelle valeur aurait cette variable 'key'... sans doute la dernière valeur qu'il a prise à  la dernière itération de la boucle for, mais même si c'était le cas c'est pas du tout ce que tu veux !

    dans 1284031253:

    J'ai un autre probleme (comme tu peux le voire) avec les caracteres en cyrilique. ils sont tres bien affichés dans le plist mais pas du tout compris par le NSDictionary
    Non je ne pense pas que ce soit un vrai problème. La console (et donc les messages écrits par NSLog) c'est comme un terminal, c'est pas prévu pour afficher des caractères avec des diacritiques ou des caractères Unicode, du coup il ne saura pas toujours t'afficher correctement dans la console un "é" ou autre chose, tu verras pas un joli texte en clair pour ces cas particuliers d'accents. Mais ça veut pas dire que ce n'est pas le bon contenu.
    Au contraire même, puisqu'il t'affiche des "\Uxxxx" pour chaque caractère cyrillique, ce qui est la notation normale d'un caractère Unicode générique. Donc quand il t'affiche "\U043e" dans la console par exemple, il faut comprendre ça comme "ici y'a le caractère Unicode dont le codepoint vaut 043e (en hexa), que la console ne saura pas afficher proprement car elle ne sait afficher que des caractères ASCII mais c'est bien le bon caractère".
    D'ailleurs si tu consultes une Table Unicode qui liste tous les codepoints unicodes (équivalent des codes ASCII pour les encodages US-ASCII) existant et le caractère auquel ils correspondent, on voit que les codepoints \U0400 à  \U04FF correspondent en effet à  la tranche des caractères cyrilliques (et que ton \U043e par exemple correspond à  une lettre ressemblant fort à  notre 'o' minuscule latin). Donc tes caractères sont bien compris par le NSDictionary c'est juste que la console ne sait pas écrire/afficher des caractères en cyrillique (et en Unicode de manière générale) c'est pour ça qu'il te l'affiche comme ça. D'ailleurs tu as bien fait de mettre tes données dans un PLIST car tu n'aurais pas pu les mettre par exemple directement dans le code ou autre, les fichiers de code (.h, .m) n'étant pas en Unicode...
    Si tu affiches le même texte dans un UILabel par exemple, il s'affichera correctement sur l'iPhone.

  • Babyfoot34Babyfoot34 Membre
    17:03 modifié #7
    Merci encore Aligator pour ces explications excellentes et compréhensibles (je veux dire par rapport a certain passage de la doc en ligne Apple).

    Bon j'avance doucement mais j'avance

    voici ma derniere PONTE  :P

    et cette fois cela fonctionne. J'ai plcacé quelques commentaires pour les autres débutant

    <br />- (IBAction)Ecouter: (id) sender{<br />	<br />	//Chemin de fichier (plist) ou se trouvent les données<br />	path = [[NSBundle mainBundle] pathForResource:@&quot;Data&quot; ofType:@&quot;plist&quot;]; <br />	<br />	//Remplissage du tableau avec les donnée du fichier plist<br />	dict = [[NSDictionary alloc] initWithContentsOfFile:path];<br />	<br />	//Affectation d&#39;une variable pour stocker la valeure contenue dans la clef &lt;Item 1&gt; du fichier plist<br />	NSDictionary *fiche_2 = [dict objectForKey:@&quot;Item 1&quot;]; // ATTENTION le 1er c&#39;est 0, le 2e c&#39;est 1<br />	valeur = [fiche_2 valueForKey:@&quot;Audio_Fr&quot;];<br />		<br />		//On controle via la console pour verifier le bon fonctionnement<br />		NSLog(@&quot;value: %@&quot;, valeur);<br />	<br />	// on créer un NSURL pour pouvoir passer les donnés a l&#39;objet audioPlayer<br />	// qui ne peut recevoir apparement que ce type de donnés<br />	NSURL *url = [NSURL fileURLWithPath:[NSString stringWithFormat:@&quot;%@/%@&quot;, path, valeur]];	<br />			<br />	// On peut verifier dans la console que l&#39;on a pas oublier un slash par exemple<br />	NSLog(@&quot;url : %@/%@&quot;, path ,valeur);<br />	<br />	//on initialise notre objet audioPlayer avec les données<br />	audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&amp;error];<br />	<br />	//On joue le morceau <br />	[audioPlayer play];	<br />		//lectureOn =1;				<br />	}<br />
    


    Ben Zut Flut et Pomme d'Apple ... ca ne marche pas la musique

    ???
  • Babyfoot34Babyfoot34 Membre
    17:03 modifié #8
    Finalement j'ai fini par trouver

    Il faut absolument charger dans le .h et le .m AudioToolBox car sinon le fichier son marche sur le simulateur mais pas sur l'Iphone. Je ne sais pas pourquoi mais avec cette Framework cela fonctionne. Deplus mon fichier son fonctionne avec NSDATA.
    <br />- (IBAction)Ecouter: (id) sender{<br />	<br />	//Chemin de fichier (plist) ou se trouvent les données<br />	path = [[NSBundle mainBundle] pathForResource:@&quot;Data&quot; ofType:@&quot;plist&quot;]; <br />	<br />	//Remplissage du tableau avec les donnée du fichier plist<br />	dict = [[NSDictionary alloc] initWithContentsOfFile:path];<br />	<br />	//Affectation d&#39;une variable pour stocker la valeure contenue dans la clef &lt;Item 1&gt; du fichier plist<br />	NSDictionary *fiche_2 = [dict objectForKey:@&quot;Item 1&quot;]; // ATTENTION le 1er c&#39;est 0, le 2e c&#39;est 1<br />	valeur = [fiche_2 valueForKey:@&quot;Audio_Fr&quot;];<br />		<br />		//On controle via la console pour verifier le bon fonctionnement<br />		NSLog(@&quot;value: %@&quot;, valeur);<br />	<br />	// on créer un NSDATA pour pouvoir passer les donnés a l&#39;objet audioPlayer<br />	NSData *fichierSon;		<br />			<br />	//on initialise notre objet audioPlayer avec les données<br />	fichierSon = [NSData dataWithContentsOfURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:valeur ofType:NULL]]];<br />	audioPlayer = [[AVAudioPlayer alloc] initWithData:fichierSon error:NULL];<br />		<br />	//On joue le morceau <br />	[audioPlayer play];	<br />			<br />	}<br />
    


    Aller bonne chance a tous

Connectez-vous ou Inscrivez-vous pour répondre.