Capture d'écran vidéo

helgrindhelgrind Membre
16:05 modifié dans API AppKit #1
Bonjour,

J'ai essayé l'exemple d'Apple OpenGLScreenCapture pour faire des captures vidéo de l'écran.
Le problème, c'est qu'il compresse les images à  la volée et ça charge beaucoup le CPU.

J'aimerais pouvoir stocker les images dans un fichier, puis les encoder à  la fin de la capture, et que ce fichier ne soit pas trop volumineux. Mais je ne vois pas comment faire  :-\\

:why?:
Merci

Réponses

  • GGGG Membre
    16:05 modifié #2
    as tu essayé cela :
    <br />	CGImageRef _screenShot = CGWindowListCreateImage(CGRectInfinite, kCGWindowListOptionOnScreenOnly, kCGNullWindowID, kCGWindowImageDefault);<br /><br />	NSBitmapImageRep *_bitmapRep = [[NSBitmapImageRep alloc] initWithCGImage:_screenShot];<br /><br />	NSImage *_image = [[NSImage alloc] initWithData:[_bitmapRep TIFFRepresentation]]; <br /><br />	[_mov addImage:_image <br />	&nbsp;  forDuration:QTMakeTime(1,_imagesPerSecond/5.) <br />	withAttributes:[NSDictionary dictionaryWithObjectsAndKeys:@&quot;jpeg&quot; , QTAddImageCodecType,[NSNumber numberWithLong:codecHighQuality],QTAddImageCodecQuality, nil]];<br />	// ici _mov est un QTMovie* _mov;<br />	[_image release];<br />	[_bitmapRep release];<br />	CGImageRelease(_screenShot)<br />
    

    c'est pas trop consommateur de CPU enfin moins que toutes les autres solutions que j'avais pu trouvé.

  • helgrindhelgrind Membre
    16:05 modifié #3
    Merci je vais essayer ;)

  • helgrindhelgrind Membre
    16:05 modifié #4
    Après quelques tests, cette méthode est quand même bien moins performante qu'en utilisant OpenGL
    (logique quand même).

    Une question qui concerne plus ou moins le sujet: comment je peux enregistrer un CVPixelBuffer dans un fichier?
    Que retourne les fonctions CVPixelBufferGetBytesPerRow() et CVPixelBufferGetBytesPerRowOfPlane() ?
  • helgrindhelgrind Membre
    16:05 modifié #5
    J'ai réussi:

    size_t height, rowBytes;<br />void *baseAddr = NULL;<br />			<br />CVPixelBufferLockBaseAddress( pixelBuffer, 0 );<br />			<br />rowBytes = CVPixelBufferGetBytesPerRow( pixelBuffer );<br />baseAddr = CVPixelBufferGetBaseAddress( pixelBuffer );<br />height = CVPixelBufferGetHeight( pixelBuffer );<br />			<br />NSData *data = [[NSData alloc] initWithBytes:baseAddr length:(rowBytes * height)];<br /><br />CVPixelBufferUnlockBaseAddress(pixelBuffer, 0);
    


    Le problème, c'est que chaque image fait environ 5mo  :o (à  30fps ça fait un peu beaucoup)
    Y a t-il un moyen de compresser les images en temps réel pour quelles fassent pas plus de 100ko chacune?
  • AntilogAntilog Membre
    16:05 modifié #6
    Heu..

    dans 1201287439:

    []
    Le problème, c'est qu'il compresse les images à  la volée et ça charge beaucoup le CPU.

    J'aimerais pouvoir stocker les images dans un fichier, puis les encoder à  la fin de la capture, et que ce fichier ne soit pas trop volumineux. Mais je ne vois pas comment faire  :-\\
    []


    Tu n'as pas l'impression de tourner en rond???
    ;)

  • helgrindhelgrind Membre
    juillet 2008 modifié #7
    dans 1216756323:

    Tu n'as pas l'impression de tourner en rond???
    ;)


    :)

    Si, mais je suis pas beaucoup aidé non plus et il y a vraiment aucune info sur ce sujet...

    Je me demande comment fait Snapz Pro...
    J'ai remarqué qu'il stocke la capture dans un fichier temporaire, sans encoder la vidéo.
    Pour une capture de 15" le fichier pèse 32mo.

    Pour ce même temps j'arrive à  70mo en compressant avec LZO  ???
  • AntilogAntilog Membre
    16:05 modifié #8
    Je ne sais pas vraiment, mais puisque je m'en suis mêlé sans raison  :o , voici mon idée:

    Si je devais faire une capture d'écran vidéo en mode "économe" (partant du principe que je reçois le flux image par image):
    - Si possible, je baisse la résolution de l'image, je supprime des couleurs dès réception
    - je compresse l'image avec l'algo le plus rapide possible

    Ensuite, à  la fin de la réception du flux (peut-être même seulement lors de la sauvegarde/copie/drag), j'encode toutes les images avec le bon algorithme qui va bien et qui est efficace...

    Tout ceci n'étant que théorique, sans aucune idée de la faisabilité...    :)beta:
  • MalaMala Membre, Modérateur
    16:05 modifié #9
    dans 1216763440:

    Je me demande comment fait Snapz Pro...
    J'ai remarqué qu'il stocke la capture dans un fichier temporaire, sans encoder la vidéo.
    Pour une capture de 15" le fichier pèse 32mo.

    Pour ce même temps j'arrive à  70mo en compressant avec LZO  ???

    Et bien c'est tout simplement parce que Snapz Pro travaille avec un format vidéo tampon qui exploite les notions de redondance spatio-temporelle et la redondance spatiale. Toi tu ne fais que compresser chaque image l'une après l'autre sans tenir compte des précédentes.

    Un peu de lecture:
    Encodage video

    Maintenant, pour augmenter les performances, ce genre de soft exploite aussi à  fond les possibilités de vectorisation (Altivec, SSE) afin de réduire l'usage du CPU ou du moins de permettre une meilleurs qualité à  puissance équivalente.

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