2009-10-03 15 views
7

Estoy implementando un software para capturar video desde la cámara web. He visto la muestra MyRecorder en Apple Dev y funciona bien.marco de captura de cacao desde la webcam

He intentado añadir un botón para tomar una instantánea de vídeo con este código:

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

pero mCurrentImageBuffer siempre está vacía. ¿Cómo puedo tomar el fotograma actual de mi cámara web y ponerme mCurrentImageBuffer?

He intentado utilizar

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

pero nunca llama. ¿Cómo puedo decidir cuándo call captureOutput delegate method? ¿Alguna idea?

gracias, Andrea

+0

He movido el código de definición QTCaptureDecompressedVideoOutput al final de la inicialización del video y ahora mCurrentImageBuffer no está vacío, pero no hay videos guardados en el disco –

+0

El [imagesnap] (http://iharder.sourceforge.net/current/ macosx/imagesnap /) open-source project es una herramienta de línea de comandos Object-C para tomar fotos de webcam. –

Respuesta

3

Parece que está intentando usar la API QTKit Capture para capturar video desde su cámara web. La aplicación de muestra MyRecorder es prácticamente el programa de captura de video de funcionamiento más simple que puede hacer utilizando esta API. No quedó claro por su descripción, pero debe asegurarse de seguir su ejemplo e inicializar su sesión de video de la misma manera que lo hacen en el método -awakeFromNib dentro de MyRecorderController. Si no lo haces, no obtendrás ningún video.

En cuanto al método que está tratando de usar, -captureOutput:didOutputVideoFrame:withSampleBuffer:fromConnection: es un método de delegado para QTCaptureDecompressedVideoOutput. Una instancia de esta clase no está presente en el ejemplo de MyRecorder, porque esa muestra solo registra videos comprimidos en el disco. Para usar esto, deberá crear una instancia de QTCaptureDecompressedVideoOutput, adjuntarla a su QTCaptureSession usando -addOutput:error:, y configurar el delegado para la instancia QTCaptureDecompressedVideoOutput como su clase.

Para obtener más información sobre cómo QTKit maneja este tipo de cosas, puede consultar la sección QTKit Capture de QTKit Application Programming Guide.

+0

He declarado QTCaptureDecompressedVideoOutput en el método -awakeFromNib y lo he agregado a QTCaptureSession pero, en este caso, la captura de imagen funciona bien y el video no se guarda en el disco. –

+0

El problema es que tengo 2 tipos de addOutput: QTCaptureDecompressedVideoOutput para guardar imágenes y mCaptureMovieFileOutput para almacenar videos. ¿Es posible tener 2 salidas o tengo que definir 2 QTCaptureSession? –

+0

Debería poder tener dos salidas con una sola entrada de video. Apple muestra un diagrama de flujo para esto en la guía de QTKit vinculada anteriormente. ¿Cuán intensivo es el procesador de su captura de imagen? Tal vez no regrese desde el método de delegado lo suficientemente rápido como para permitir que la grabación de video tenga lugar. Por defecto, la captura de video usa codificación H.264, que es bastante pesada. Podría intentar configurar el video en QTCompressionOptions240SizeMPEG4Video y ver qué sucede. –

3

he tratado de utilizar

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

pero nunca se llama.

¿El objeto que implementa este método es el delegado del objeto de salida de captura?

+1

Este es mi problema, no entiendo bien este paso. –

+0

Debe ser el delegado del objeto de salida de captura. Consulte http://developer.apple.com/mac/library/documentation/General/Conceptual/DevPedia-CocoaCore/Delegation.html y el método 'setDelegate:' del objeto de salida de captura. –

+0

Perfecto, lo he visto en la muestra de Apple (muy útil) ¡gracias! –

Cuestiones relacionadas