2009-10-03 4 views
7

Je suis l'implémentation d'un logiciel pour caputre la vidéo de la webcam. J'ai vu MyRecorder exemple dans Apple Dev et ça fonctionne bien.image de capture de cacao de webcam

J'ai essayé d'ajouter un bouton pour prendre un instantané de la vidéo avec ce code:

- (IBAction)addFrame:(id)sender 
{ 
    CVImageBufferRef imageBuffer; 
    @synchronized (self) { 
     imageBuffer = CVBufferRetain(mCurrentImageBuffer); 
    } 
    if (imageBuffer) { 
    [ bla bla bla ]  
    } 
} 

mais mCurrentImageBuffer est toujours vide. Comment puis-je prendre l'image actuelle de ma webcam et mettre mCurrentImageBuffer?

J'ai essayé d'utiliser

(void)captureOutput:(QTCaptureOutput *)captureOutput 
        didOutputVideoFrame:(CVImageBufferRef)videoFrame 
        withSampleBuffer:(QTSampleBuffer *)sampleBuffer 
        fromConnection:(QTCaptureConnection *)connection 
{ 
    CVImageBufferRef imageBufferToRelease; 

    CVBufferRetain(videoFrame); 

    @synchronized (self) { 
     imageBufferToRelease = mCurrentImageBuffer; 
     mCurrentImageBuffer = videoFrame; 
    } 
    CVBufferRelease(imageBufferToRelease); 
} 

mais il n'a jamais appelé. Comment puis-je décider quand appeler captureOutput méthode de délégation? Une idée?

merci, Andrea

+0

J'ai déplacé le code de définition QTCaptureDecompressedVideoOutput à la fin de l'initialisation de la vidéo et maintenant mCurrentImageBuffer n'est pas vide, mais aucune vidéo n'est enregistrée sur le disque –

+0

The [imagesnap] (http://iharder.sourceforge.net/current/ macosx/imagesnap /) open-source project est un outil de ligne de commande d'objectif-C pour prendre des photos de webcam. –

Répondre

3

Il semble que vous essayiez d'utiliser l'API QTKit Capture pour capturer de la vidéo à partir de votre webcam. L'exemple d'application MyRecorder est à peu près le programme de capture vidéo le plus simple que vous puissiez utiliser avec cette API. Ce n'était pas clair à partir de votre description, mais vous devez vous assurer que vous suivez leur exemple, et initialisez votre session vidéo de la même manière que dans la méthode -awakeFromNib dans MyRecorderController. Si vous ne le faites pas, aucune vidéo ne sera capturée. Dans la mesure où la méthode que vous essayez d'utiliser, -captureOutput:didOutputVideoFrame:withSampleBuffer:fromConnection: est une méthode déléguée pour QTCaptureDecompressedVideoOutput. Une instance de cette classe n'est pas présente dans l'exemple MyRecorder, car cet exemple enregistre uniquement la vidéo compressée sur le disque. Pour l'utiliser, vous devez créer une instance de QTCaptureDecompressedVideoOutput, l'attacher à votre QTCaptureSession en utilisant -addOutput:error: et définir le délégué pour l'instance QTCaptureDecompressedVideoOutput comme classe. Pour plus d'informations sur la façon dont QTKit gère ce genre de chose, vous pouvez consulter la section QTKit Capture du QTKit Application Programming Guide.

+0

J'ai déclaré la méthode QTCaptureDecompressedVideoOutput on -awakeFromNib et je l'ai ajoutée à QTCaptureSession mais, dans ce cas, la capture d'image fonctionne correctement et la vidéo n'est pas sauvegardée sur le disque. –

+0

Le problème est que j'ai 2 type de addOutput: QTCaptureDecompressedVideoOutput pour enregistrer l'image et mCaptureMovieFileOutput pour stocker la vidéo. Est-il possible d'avoir 2 sorties ou dois-je définir 2 QTCaptureSession? –

+0

Vous devriez pouvoir avoir deux sorties avec une seule entrée vidéo. Apple montre un organigramme pour cela dans le guide QTKit lié ci-dessus. Comment intensif processeur est votre capture d'image? Peut-être que cela ne revient pas assez rapidement de la méthode des délégués pour permettre l'enregistrement vidéo. Par défaut, la capture vidéo utilise l'encodage H.264, ce qui est assez lourd. Vous pouvez essayer de définir la vidéo sur QTCompressionOptions240SizeMPEG4Video et voir ce qui se passe. –

3

J'ai essayé d'utiliser

- (void)captureOutput:(QTCaptureOutput *)captureOutput 
           didOutputVideoFrame:(CVImageBufferRef)videoFrame 
           withSampleBuffer:(QTSampleBuffer *)sampleBuffer 
           fromConnection:(QTCaptureConnection *)connection 

mais il n'a jamais appelé.

L'objet implémentant cette méthode est-il le délégué de l'objet de sortie de capture?

+1

Ceci est mon problème, je ne comprends pas bien cette étape. –

+0

Vous devez être le délégué de l'objet de sortie de capture. Voir http://developer.apple.com/mac/library/documentation/General/Conceptual/DevPedia-CocoaCore/Delegation.html et la méthode 'setDelegate:' de l'objet de sortie de capture. –

+0

Parfait, j'ai vu sur Apple échantillon (très utile) merci! –