2009-10-03 12 views
7

Sto implementando un software per caputre i video dalla webcam. Ho visto l'esempio di MyRecorder su Apple Dev e funziona perfettamente.frame di cattura del cacao dalla webcam

ho cercato di aggiungere un pulsante per scattare un'istantanea dal video con questo codice:

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

ma mCurrentImageBuffer è sempre vuoto. Come posso prendere frame corrente dalla mia webcam e mettere su mCurrentImageBuffer?

ho provato ad usare

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

ma non è mai chiamato. Come posso decidere quando chiamare il metodo delegato captureOutput? Qualche idea?

grazie, Andrea

+0

Ho spostato il codice di definizione Output QTCaptureDecompressedVideo alla fine dell'inizializzazione del video e ora mCurrentImageBuffer non è vuoto, ma nessun video viene salvato sul disco –

+0

Il [imagesnap] (http://iharder.sourceforge.net/current/ macosx/imagesnap /) progetto open-source è uno strumento da riga di comando C obiettivo per scattare foto con la webcam. –

risposta

3

Sembra che tu stia cercando di utilizzare l'API QTKit Capture per acquisire video dalla tua webcam. L'applicazione di esempio MyRecorder è praticamente il più semplice programma di acquisizione video funzionante che puoi utilizzare utilizzando questa API. Non è chiaro dalla tua descrizione, ma devi assicurarti di seguire il loro esempio e inizializzare la sessione video nello stesso modo in cui lo fanno nel metodo -awakeFromNib in MyRecorderController. In caso contrario, non verrà catturato nessun video.

Per quanto riguarda il metodo che si sta tentando di utilizzare, -captureOutput:didOutputVideoFrame:withSampleBuffer:fromConnection: è un metodo delegato per QTCaptureDecompressedVideoOutput. Un'istanza di questa classe non è presente nell'esempio di MyRecorder, poiché tale esempio registra solo video compressi su disco. Per utilizzarlo, devi creare un'istanza di QTCaptureDecompressedVideoOutput, collegarla al tuo QTCaptureSession utilizzando -addOutput:error: e impostare il delegato per l'istanza QTCaptureDecompressedVideoOutput come classe.

Per ulteriori informazioni su come QTKit gestisce questo tipo di cose, è possibile consultare la sezione QTKit Capture di QTKit Application Programming Guide.

+0

Ho dichiarato QTCaptureDecompressedVideoOutput su -awakeFromNib e l'ho aggiunto a QTCaptureSession ma, in questo caso, l'acquisizione dell'immagine funziona correttamente e il video non viene salvato su disco. –

+0

Il problema è che ho 2 tipo di addOutput: QTCaptureDecompressedVideoOutput per salvare l'immagine e mCaptureMovieFileOutput per archiviare il video. È possibile avere 2 output o devo definire 2 QTCaptureSession? –

+0

Dovresti essere in grado di avere due uscite con un singolo ingresso video. Apple mostra un diagramma di flusso per questo nella guida QTKit linkata sopra. Quanto è intensiva l'elaborazione del tuo video? Forse non sta tornando dal metodo dei delegati abbastanza velocemente da consentire la registrazione del video. Per impostazione predefinita, l'acquisizione video utilizza la codifica H.264, che è piuttosto pesante. Potresti provare a impostare il video su QTCompressionOptions240SizeMPEG4Video e vedere cosa succede. –

3

ho cercato di utilizzare

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

ma non è mai chiamati.

L'oggetto che implementa questo metodo è il delegato dell'oggetto di output di acquisizione?

+1

Questo è il mio problema, non capisco bene questo passaggio. –

+0

È necessario essere il delegato dell'oggetto di output di acquisizione. Vedi http://developer.apple.com/mac/library/documentation/General/Conceptual/DevPedia-CocoaCore/Delegation.html e il metodo 'setDelegate:' dell'oggetto di output di cattura. –

+0

Perfetto, ho visto su campione di Apple (molto utile) grazie! –

Problemi correlati