lenteur de QTMovie

Bonjour

 

Je travaille sur une application dont le but est de visualiser 2 séquences vidéos en même temps, image par image via un slider, et de projeter sur une autre vue les 2 images correspondant à  la position du slider, en superposition.

Seulement le temps de réaction est extrêmement long lorsque je fais bouger le slider.

 

Pour cela, j'utilise 2 QTMovieView avec 2 QTMovie (movie1 et movie2). Le slider fait avancer image par image les 2 movie(1 et 2) via  [movie1 setCurrentTime:timeSlider] et [movie2 setCurrentTime: timeSlider] (ou timeSlider est la valeur du slider). En même temps, je récupère les images des 2 movies à  cet instant via NSImage *imageFilm = [movie1 frameImageAtTime:[movie1 currentTime]] (idem pour movie2); et je les affiche dans une NSView via [image1 drawInRect:drawinRect1 fromRect:imageRec1 operation:NSCompositeSourceOver fraction:opacity]; (dans le drawRect de la NSView)

Ici déjà , le temps de réaction du slider devient réellement gênant. Mais si je rajoute un slider pour faire varier l'opacité d'une des 2 images dans le NSView, cela devient dramatique, il faut 1 seconde pour passer d'une image à  l'autre.

 

Est ce que quelqu'un a déjà  rencontré ce problème, sachant que je suis sous sous snowLeopard et xCode 3.2. Et si oui, comment l'avez vous traité ?? Etes vous passé aussi par QTMovie ou par autre chose ?

Autre info : les séquences video sont des .mov de 6 secondes chacune en H.264, 768 x 576

 

Merci d'avance 

Réponses

  • MalaMala Membre, Modérateur

    Je pense que ton problème vient des perfs de frameImageAtTime. J'ai le même souci.


  • CéroceCéroce Membre, Modérateur

    Les opérations drawInRect:fromRect: sont lentes. C'est normal parce que Quartz doit recopier une partie de la bitmap pour la découper. drawInRect est bien plus rapide.


     


    Pour le reste, je ne suis pas un spécialiste, mais Core Video ne pourrait pas être une part de la solution en évitant de copier les frames de la mémoire vidéo à  la mémoire centrale ?


  • Merci à  tous les 2 pour vos réponses. Cependant, Mala, comment as tu  fait pour corriger ton pbl ? et Céroce : je vais regarder avec drawInRect mais en revanche, je me suis penché sur CoreVideo mais je ne pense pas avoir les compétences nécessaires aujourd'hui. Les résultats mis en avant sur internet sont alléchants mais je trouve que cela reste une sacré usine à  gaz. 


     


    Du coup, mon autre question est : puisque j'envisage de passer sous Mountain Lion, est ce que xCode 4 propose d'autres solutions plus accessibles comme AVFondation sous iOS par exemple ?


     


    Merci d'avance


  • MalaMala Membre, Modérateur
    avril 2013 modifié #5

    Dans mon cas, c'était pour créer une "jaquette" avec un slider permettant de choisir une scène d'un film. J'ai été obligé de feinter: j'affiche un QTMovieView pendant le drag du slider pour avoir un aperçu temps réel. Quand l'utilisateur relâche le slider là  j'effectue la capture et je remets ma NSImageView en place (l'utilisateur a aussi la possibilité de glisser une image sur la vue genre une vraie jaquette d'où la NSImageView).


     


    A noter que frameImageAtTime pose aussi un autre problème: dans le cas d'usage de codecs externes elle peut ne pas retourner d'image du tout (codec payant).


     


    J'avais imaginé passer par une QTMovieView masquée pour capturer sa frame en offscreen mais j'ai pas investigué d'avantage pour l'instant.


     


    CoreVideo n'apporte pas de solution à  ce genre de problématique à  ma connaissance.


  • Idée super


     


    Merci beaucoup


     


    Je vais essayer

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