ios avfoundation avcapturesession

ios - AVCaptureSession con salidas mĂșltiples?



avfoundation (1)

Es más fácil de lo que piensas.

Ver: AVCamDemo

  1. Captura datos utilizando AVCaptureVideoDataOutput.
  2. Cree una nueva cola de envío antes de grabar, por ejemplo. ordingQueue : recordingQueue = dispatch_queue_create("Movie Recording Queue", DISPATCH_QUEUE_SERIAL);
  3. En el método captureOutput: didOutputSampleBuffer: fromConnection: delegate, capture el samplebuffer, consérvelo y, en la cola de grabación, escríbalo en el archivo:

    -(void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection { CFRetain(sampleBuffer); dispatch_async(recordingQueue, ^{ if (assetWriter) { if (connection == videoConnection) { [self writeSampleBuffer:sampleBuffer ofType:AVMediaTypeVideo]; } else if (connection == audioConnection) { [self writeSampleBuffer:sampleBuffer ofType:AVMediaTypeAudio]; } } CFRelease(sampleBuffer); }); } - (void) writeSampleBuffer:(CMSampleBufferRef)sampleBuffer ofType:(NSString *)mediaType { CMTime presentationTime = CMSampleBufferGetPresentationTimeStamp(sampleBuffer); if ( assetWriter.status == AVAssetWriterStatusUnknown ) { if ([assetWriter startWriting]) { [assetWriter startSessionAtSourceTime:presentationTime]; } else { NSLog(@"Error writing initial buffer"); } } if ( assetWriter.status == AVAssetWriterStatusWriting ) { if (mediaType == AVMediaTypeVideo) { if (assetWriterVideoIn.readyForMoreMediaData) { if (![assetWriterVideoIn appendSampleBuffer:sampleBuffer]) { NSLog(@"Error writing video buffer"); } } } else if (mediaType == AVMediaTypeAudio) { if (assetWriterAudioIn.readyForMoreMediaData) { if (![assetWriterAudioIn appendSampleBuffer:sampleBuffer]) { NSLog(@"Error writing audio buffer"); } } } } }

Actualmente estoy desarrollando una aplicación para iOS que aplica CoreImage a la alimentación de la cámara para tomar fotos y videos, y me he encontrado con un pequeño obstáculo.

Hasta ahora he estado usando AVCaptureVideoDataOutput para obtener los búferes de muestra y manipularlos con CoreImage, y luego mostré una vista previa simple, además de usarlos para capturar fotos y guardarlas.

Cuando intenté implementar la grabación de video, al escribir los SampleBuffers en un video cuando los recibí de AVCaptureVideoDataOutput , tenía una velocidad de cuadros muy lenta (probablemente debido a la otra imagen relacionada con el procesamiento que estaba ocurriendo).

Así que me preguntaba, ¿es posible tener un AVCaptureVideoDataOutput y un AVCaptureMoveFileOutput en la misma sesión de AVCaptureSession?

Le di una vuelta rápida y descubrí que cuando agregué la salida adicional, mi AVCaptureVideoDataOutput dejó de recibir información.

Si puedo hacerlo funcionar, espero que signifique que puedo usar la segunda salida para grabar video a altas tasas de cuadros y realizar un procesamiento posterior en el video después de que el usuario haya dejado de grabar.

Cualquier ayuda será apreciada.