Bases et principes, Help !!!!

ZyrolZyrol Membre
04:26 modifié dans API AppKit #1
Bonjour,

J'ai quelques questions précises concernant le développement sous Xcode. Si vous pouviez me répondre directement, sans me renvoyer sur des liens ce serait super, car j'aimerai des réponses d'utilisateur et en français !

Je cherche à  contrôler une NSMovieView (basique dans un premier temps), Pour cela j'ai crée sous IB : la fentre NSMovieView, 2 boutons Lecture et stop, j'ai lier les outlets et actions aux éléments de l'interface...

Bref je me suis donc retrouvé dans Xcode une fois terminé la phase de IB.

Maintenant je me retrouve avec un .h comme ceci :
/* Controleur */
#import <Cocoa/Cocoa.h>
@interface Controleur : NSObject
{
    IBOutlet id Bt_lecture;
    IBOutlet id Bt_Stop;
}
- (IBAction)lecture:(id)sender;
- (IBAction)stop:(id)sender;
@end


Et un .m comme cela :
#import "Controleur.h"
@implementation Controleur
- (IBAction)lecture:(id)sender
{
}
- (IBAction)stop:(id)sender
{
}
@end


J'ai bien compris qu'il faut implementer dans le .h mais quelle bibliothèque inclure ? ou les déclarer ? comment utiliser les méthodes de la classe NSmovieView ?

Je viens du "monde" Delphi PC ou tout se faisait tout seul, et j'avoue avoir pris de mauvaise habitude !!! Si quelqu'un pouvait m'aiguiller dans mes premiers pas pour que je comprenne le principe ce serait sympa.

Merci beaucoup.

Réponses

  • muqaddarmuqaddar Administrateur
    04:26 modifié #2
    Salut Zyrol,

    Tient j'ai piqué ces infos sur PO, ça ne peut que t'aider. Tu n'as plus qu'à  adapter tes noms d'outlet et movieView.

    - (IBAction)openMovie:(id)sender<br />{<br />	NSArray *fileTypes = [NSArray arrayWithObjects: @&quot;mov&quot;, @&quot;mpg&quot;, @&quot;mp3&quot;, @&quot;jpg&quot;, nil];<br />&nbsp; <br />	NSOpenPanel *oPanel = [NSOpenPanel openPanel];<br /><br />	int result = [oPanel runModalForDirectory:NSHomeDirectory() file:nil types:fileTypes];<br />&nbsp; &nbsp; <br />	if (result == NSOKButton) {<br />		NSArray *movieToOpen = [oPanel URLs];<br />		NSURL *movieURL = [movieToOpen objectAtIndex:0];<br /><br />		NSMovie *movie = [[NSMovie alloc] initWithURL:movieURL byReference:NO];<br />		[movieView setMovie:movie];<br />&nbsp; }<br />}<br /><br />- (IBAction)playMovie:(id)sender <br />{&nbsp; &nbsp;  <br />	[movieView start: self];<br />}<br />
    


    Le tutoriel, très court, et en Français ;) est là  :
    http://www.projectomega.org/article.php?lg=fr&php=oreilly_cocoa18&p=1
  • ZyrolZyrol Membre
    04:26 modifié #3
    Merci, je m'y attelle, et je t'en dit des nouvelles.
  • ZyrolZyrol Membre
    04:26 modifié #4
    Super ce tuto, ça m'a permit de bien progresser.

    il me reste une zone de flou :
    je cherche à  faire un logiciel de double-ecran pour un usage sportif. il faut donc que je place 2 NSMovie View dans une fenêtre.
    J'en ai placé une, je la contrôle avec des boutons : pas de problème.
    mais j'aimerais pouvoir la nommer, de telle sorte à  ce que je puisse en placer une autre avec un nom diffèrent pour les contrôler ensuite avec leur nom.

    Toujours l'habitude de Delphi ou ça se passer à  peu près comme ça. Mais là  je n'arrive pas à  créer de nom pour les différencier.

    Une piste ?
  • ZyrolZyrol Membre
    04:26 modifié #5
    Il m'est venu une idée : si je crée 2 controleurs, 1 pour la premiere NSMovie et l'autre pour la seconde ?

    Je pars sur ça.....
  • ZyrolZyrol Membre
    04:26 modifié #6
    Bon j'ai suivi mon idée : j'ai crée un second controleur pour l'autre fenetre video. Tout fait comme y faut, ça compile.
    Mais là  : je réussi à  ouvrir une video dans la premiere fenetre, mais pas dans la seconde.

    Une idée ?
  • muqaddarmuqaddar Administrateur
    04:26 modifié #7
    Je pense qu'un seul controlleur devrait suffir.

    Il te faut 2 outlets movieView. A toi d'indiquer dans quel outlet charger ta video et quelle video il doit lire toujours grâce à  son outlet.

    Ex :
    [movieView1 setMovie:movie1];
    [movieView2 setMovie:movie2];

    movieView1 étant l'outlet 1 et movie1 sa vidéo et pareil pour le 2
  • ZyrolZyrol Membre
    04:26 modifié #8
    Nouvelle petite interrogation :
    J'ai crée un bouton qui permet de lancer les lecteurs en même temps, voici à  quoi ressemble le code de ce bouton :
    {
    [movieView1 start:self];
    [movieView2 start:self];
    }

    Le problème c'est que la vidéo 2 se mets en marche avec un décalage par rapport à  la première. Logique vu que le start est d'abord effectué sur movieView1.

    Comment parer à  ce problème ? comment lancer les 2 vidéos en même temps ? peut on les charger au préalable pour gagner du temps ?

    Merci de vos réponses.
  • mpergandmpergand Membre
    04:26 modifié #9
    Je ne saurais être tenu pour responsable du non fonctionnement du bidouillage ci-après :D ;D

    <br />#include &lt;QuickTime/QuickTime.h&gt;<br /><br />....<br /><br />Movie movie1=[[movieView1 movie] QTMovie];<br />Movie movie2=[[movieView2 movie] QTMovie];<br /><br />OSErr err=PrerollMovie(movie1,GetMovieTime(movie1,NULL),GetMoviePreferredRate(movie1));<br />err=PrerollMovie(movie2,GetMovieTime(movie2,NULL),GetMoviePreferredRate(movie2));<br /><br />StartMovie(movie1);<br />StartMovie(movie2);<br /><br />
    


    Si ça marche toujours pas, rajouter:

    <br />SetMovieTimeValue(movie1,0);<br />SetMovieTimeValue(movie2,0);<br />
    


    Après, j'sais plus ??? :D
  • ZyrolZyrol Membre
    04:26 modifié #10
    Oulà  !!!!

    tout d'abord, merci pour ton aide.
    Mais là , j'avoue ne pas comprendre le code en particulier les premieres lignes (Movie movie1....)

    Peut tu m'expliquer un peu plus en détail ? J'ai vu la fonction Preroll (qui est bien une fonction de chargement), donc je comprend bien le pricipe de chargement avant la lecture, mais pour adapter ton code au mien il faut que je le comprenne.

    Merci d'avance.
  • mpergandmpergand Membre
    04:26 modifié #11
    Salut,

    ben à  la place de :

    [movieView1 start:self];
    [movieView2 start:self];

    tu mets mon bout de code :D

    Movie movie1=[[movieView1 movie] QTMovie]; permet de récupérer la structure Movie et d'appeler directement les méthodes quickTime sans passer pas NSMovieView donc...
  • ZyrolZyrol Membre
    04:26 modifié #12
    Monstrueux !!!!

    ça marche. il y a encore un leger decalage mais je pense qu'il est de l'ordre de quelques milliemes....

    Par contre les boutons de pause ne marchent plus, j'avais mis un bouton de pause comun, et il ne fonctionne plus : le code etait :
    [movieView1 stop:self];
    [movieView2 stop:self];

    normalement ça devrait être independant, non ?
  • ZyrolZyrol Membre
    04:26 modifié #13
    en fait j'ai compris il faut que je fasse appel à  ces 2 lignes :

    Movie movie1=[[movieView1 movie] QTMovie];
    Movie movie2=[[movieView2 movie] QTMovie];

    avant les mises en pauses et me passer des MovieView.

    La pause est declenché par stopMovie(movie1)


    Bon je crois que je vais ouvrir un autre sujet car celui là  commence à  ne plus être dans les "Bases et principes"

    En tout cas merci beaucoup
  • mpergandmpergand Membre
    novembre 2004 modifié #14
    Oui, currieux ???

    essaye:

    StopMovie(movie1);
    StopMovie(movie2);

    [edit]

    ok, tu as trouvé :D

    néanmoins, c'est un peu génant, le movieView est un peu perdu, donc il vaudrait mieux faire alors:

    [movieView1 start:self];

    et
    [movieView1 stop:self];
  • ZyrolZyrol Membre
    04:26 modifié #15
    Je viens de m'atteler à  essayer de mettre au ralenti.

    je me sers pour cela de la fonction setRate(). J'arrive à  accélérer la vidéo sans problème, à  remonter en arrière, mais impossible de la ralentir, c'est le comble !
    le flottant en paramètre est défini à  1 pour une vitesse normale, supérieur à  1 ça accélère, inférieur à  0 ça va dans l'autre sens, donc logiquement entre 0 et 1 ça ralentit, mais ça ne fait rien !!

    une idée ?
Connectez-vous ou Inscrivez-vous pour répondre.