2009-10-03 8 views
7

Ich implementiere eine Software zu caputre Video von der Webcam. Ich habe mein MyRecorder-Beispiel in Apple Dev gesehen und es funktioniert gut.Kakao-Capture-Frame von der Webcam

Ich habe versucht, eine Schaltfläche hinzufügen mit diesem Code, um einen Schnappschuss von Video zu nehmen:

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

aber mCurrentImageBuffer ist immer leer. Wie kann ich den aktuellen Frame von meiner Webcam nehmen und mCurrentImageBuffer anlegen?

habe ich versucht,

(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); 
} 

aber es wird nie aufgerufen zu verwenden. Wie kann ich entscheiden, wann Call CaptureOutput Delegate-Methode? Irgendeine Idee?

Dank, Andrea

+0

Ich habe den QTCaptureDecompressedVideoOutput-Definitionscode am Ende der Videoinitialisierung verschoben und jetzt ist mCurrentImageBuffer nicht leer, aber kein Video wird auf der Festplatte gespeichert –

+0

Die [imagesnap] (http://iharder.sourceforge.net/current/ macosx/imagesnap /) open-source project ist ein objective-C Kommandozeilen-Tool zur Aufnahme von Webcam-Bildern. –

Antwort

3

Es sieht so aus, als ob Sie versuchen, die QTKit Capture-API zum Erfassen von Videos von Ihrer Webcam zu verwenden. Die MyRecorder-Beispielanwendung ist so ziemlich das einfachste funktionierende Videoaufnahmeprogramm, das Sie mit dieser API erstellen können. Es war nicht klar aus Ihrer Beschreibung, aber Sie müssen sicherstellen, dass Sie ihrem Beispiel folgen und Ihre Videosession auf die gleiche Weise initialisieren wie in der -awakeFromNib Methode in MyRecorderController. Wenn Sie dies nicht tun, werden Sie kein Video erhalten.

Soweit die Methode, die Sie versuchen zu verwenden, ist -captureOutput:didOutputVideoFrame:withSampleBuffer:fromConnection: eine Delegate-Methode für QTCaptureDecompressedVideoOutput. Eine Instanz dieser Klasse ist im MyRecorder-Beispiel nicht vorhanden, da dieses Beispiel nur komprimiertes Video auf Datenträger aufzeichnet. Um dies zu verwenden, müssen Sie eine Instanz von QTCaptureDecompressedVideoOutput erstellen, sie an Ihre QTCaptureSession mit -addOutput:error: anhängen und den Delegaten für die QTCaptureDecompressedVideoOutput Instanz als Ihre Klasse festlegen.

Weitere Informationen darüber, wie QTKit mit solchen Dingen umgehen kann, finden Sie im Abschnitt QTKit Capture der QTKit Application Programming Guide.

+0

Ich habe QTCaptureDecompressedVideoOutput auf der -aakeFromNib-Methode deklariert, und ich habe es zu QTCaptureSession hinzugefügt, aber in diesem Fall funktioniert die Bilderfassung einwandfrei und das Video ist nicht sicher auf der Festplatte. –

+0

Das Problem ist, dass ich zwei Arten von addOutput habe: QTCaptureDecompressedVideoOutput zum Speichern von Bildern und mCaptureMovieFileOutput zum Speichern von Videos. Ist es möglich 2 Ausgänge zu haben oder muss ich 2 QTCaptureSession definieren? –

+0

Sie sollten zwei Ausgänge mit einem einzigen Videoeingang haben können. Apple zeigt hierzu im oben verlinkten QTKit-Guide ein Flussdiagramm. Wie intensiv ist Ihre Bilderfassung? Vielleicht kommt es nicht schnell genug von der Delegiertenmethode zurück, um die Videoaufnahme zu ermöglichen. Standardmäßig verwendet die Videoaufnahme die H.264-Codierung, die ziemlich schwer ist. Sie könnten versuchen, das Video auf QTCompressionOptions240SizeMPEG4Video einzustellen und zu sehen, was passiert. –

3

Ich habe versucht,

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

zu verwenden, aber es ist nie genannt.

Ist das Objekt, das diese Methode implementiert, der Delegate des Objekts des Erfassungsausgabeobjekts?

+1

Das ist mein Problem, ich verstehe diesen Schritt nicht gut. –

+0

Sie müssen Delegat des Capture-Ausgabeobjekts sein. Siehe http://developer.apple.com/mac/library/documentation/General/Conceptual/DevPedia-CocoaCore/Delegation.html und die Methode 'setDelegate:' des Capture-Ausgabeobjekts. –

+0

Perfekt, ich habe auf Apple Probe gesehen (sehr nützlich) danke! –