lenteur de QTMovie
Fred20
Membre
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
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Je pense que ton problème vient des perfs de frameImageAtTime. J'ai le même souci.
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
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