Afficher l'écoulement du temps d'une vidéo en lecture

CrazyJoCrazyJo Membre
11:50 modifié dans API AppKit #1
Bonjour,

Petite solicitation du jour : comment faire pour afficher le temps écoulé d'une vidéo lue...
J'utilise bien sûr QTKit et je connais l'attribut currentTime qui retourne le temps courant de la lecture.
Mon problème est comment faire en sorte que mon objet QTMovieView notifie "sans cesse" ma fonction du type "afficherLeTempsEcoule" ... Il y a bien un exemple d'Apple qui fait ce que je demande mais je me perds dans leurs classes...  B)
(http://developer.apple.com/library/mac/#samplecode/QTKitMovieShuffler/Introduction/Intro.html)

Merci

Réponses

  • mpergandmpergand Membre
    11:50 modifié #2
    <br />#pragma mark *** playback notification ***<br /><br />	// set an action filter function for the movie controller<br />-(void)installMCActionFilter<br />{<br />	if (!mcActionFilterCallBack)<br />	{<br />		mcActionFilterCallBack =&nbsp; NewMCActionFilterWithRefConUPP(&amp;MyMCActionFilterCallBack);<br />	}<br />	<br />	if (!mcActionFilterCallBack) goto bail;<br />	<br />	ComponentResult	cr = MCSetActionFilterWithRefCon([self quickTimeMovieController],<br />										 mcActionFilterCallBack,<br />										 (long)self);<br />	if (cr != noErr)<br />	{<br />		DisposeMCActionFilterWithRefConUPP(mcActionFilterCallBack);<br />		mcActionFilterCallBack = nil;<br />	}<br />	<br />bail:<br />	return;<br />}<br /><br />	// specify the selector to be called during playback<br />-(void)setMoviePlaybackNotificationCallback:(SEL)aSelector withObject:(id)anObject<br />{<br />	if (!playbackTargetObject || !playbackSelector)<br />	{<br />		[self installMCActionFilter];<br />	}<br />	<br />	[self setPlaybackSelector:aSelector withObject:anObject];<br />}<br /><br />
    


    Ca installe un callback sur le movieController, c'est du bon gros Carbon qui tache  :)

    Pour pas te prendre la tête avec ça, tu peux faire la même chose avec un simple NSTimer qui se déclenche toutes les secondes ...
  • CrazyJoCrazyJo Membre
    11:50 modifié #3
    A vrai dire j'avais pensé au NSTimer mais ça devient un peu plus délicat lorsque l'utilisateur avance ou recule manuellement dans la video ...

    Effectivement c'est du lourd ton code  :o ! Je vais encore creuser un peu l'exemple d'Apple puis je retournerai sur ta proposition. Au passage : 'goto' c'est de l'obj-c ? ( goto bail ? )

    Je prends toujours les nouvelles propositions au passage 
    Au final c'est moins anodin que ça y paraà®t cette fonctionnalité ...
  • mpergandmpergand Membre
    11:50 modifié #4
    dans 1305489683:

    Effectivement c'est du lourd ton code  :o ! Je vais encore creuser un peu l'exemple d'Apple puis je retournerai sur ta proposition. Au passage : 'goto' c'est de l'obj-c ? ( goto bail ? )


    C'est pas mon code, c'est celui d'Apple dans l'exemple que tu as mis en lien  ;)
  • CrazyJoCrazyJo Membre
    mai 2011 modifié #5
    ok ...  :o

    Donc à  propos de cet exemple j'essaie de remonter le code depuis cette méthode de la classe AppController (ligne 447) :
    En effet c'est là  que le contenu du NSTextField movieTimeTextBox est rafraà®chi.
    <br />-(void)adjustTimeDisplayForCurrentMovieTime<br />{<br />	MyQTMovie *curMovie = [self activeRowMovie];<br />	[movieTimeTextBox setStringValue:QTStringFromTime([curMovie currentPlayTime])];<br />	NSLog(@&quot;[curMovie currentPlayTime] %i&quot;,[curMovie currentPlayTime]);<br />}
    


    Ca me remonte jusqu'à  ici : (ligne 723) toujours dans AppController :

    <br />-(void)enableMovieCallbacksForCurrentMovie<br />{<br />	MyQTMovie *aMovie = [self activeRowMovie];<br /><br />	[aMovie setMovieDidEndNotificationCallback:@selector(movieDidEndCallBack:) withObject:self];<br />	[aMovie setMovieRateChangeNotificationCallback:@selector(movieStoppedCallBack:) withObject:self];<br />	[aMovie [b]setMoviePlaybackNotificationCallback[/b]:@selector(moviePlayingCallBack:) withObject:self];<br />}<br />
    


    Et c'est là  que je me rends compte qu'ils ont créé une classe perso MyQTMovie ...
    A l'intérieur on retrouve ce code :
    // specify the selector to be called during playback<br />-(void)setMoviePlaybackNotificationCallback:(SEL)aSelector withObject:(id)anObject<br />{<br />	if (!playbackTargetObject || !playbackSelector)<br />	{<br />		[self installMCActionFilter];<br />	}<br />	<br />	[self setPlaybackSelector:aSelector withObject:anObject];<br />}<br />
    


    avec le fameux appel à  installMCActionFilter qui mène au code que tu viens de poster ...

    et pour finir la méthode -(IBAction)playMovie:(id)sender appel cette méthode :
    <br />-(void)initTimeLineSliderForMovie<br />{<br />	MyQTMovie *curMovie = [self activeRowMovie];<br />	QTTime duration = QTZeroTime;<br />	duration = [curMovie duration];<br />	[movieTimeLineSlider setMaxValue: duration.timeValue];<br />	[movieTimeLineSlider setIntValue: 0];<br />}<br /><br />
    


    Avec la création de ce fameux objet ... curMovie...

    Donc voilà  j'essaie de factoriser tout ça ... c'est pas gagné  :'(
    Allez courage, vite une Perrier et c'est reparti !  :p
  • CéroceCéroce Membre, Modérateur
    11:50 modifié #6
    dans 1305489683:

    Au passage : 'goto' c'est de l'obj-c ?

    Non, c'est du langage C. Peu de bouquins en parlent parce que ça peut conduire à  de mauvaises habitudes, mais c'est parfois une manière plus lisible de sortir de plusieurs boucles imbriquées ou de sauter à  la partie de gestion des erreurs (comme dans cet exemple).
    En règle générale, il faut faire des sauts en avant et jamais en arrière.
  • FKDEVFKDEV Membre
    11:50 modifié #7
    Parfaite description du goto.
  • CrazyJoCrazyJo Membre
    11:50 modifié #8
    Oui , merci beaucoup !  :)

    J'ai finalement opté pour un NSTimer  ::)
Connectez-vous ou Inscrivez-vous pour répondre.