2011-11-09 16 views
12

Actualmente estoy desarrollando una aplicación de 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 inconveniente.AVCaptureSession con múltiples salidas?

Hasta ahora he estado utilizando AVCaptureVideoDataOutput para obtener los tampones de muestra y manipularlos con CoreImage, y luego muestra una vista previa sencilla, así como usarlo para capturar fotos y guardarlas.

Cuando traté de poner en práctica la grabación de vídeo, escribiendo los SampleBuffers a un vídeo como yo los recibí del AVCaptureVideoDataOutput, tenía una frecuencia de imagen muy lento (probablemente a causa de la otra tratamientos relativos imagen que estaba pasando) .

Así que me preguntaba, ¿es posible tener una AVCaptureVideoDataOutput y una AVCaptureMoveFileOutput va en el mismo AVCaptureSession al mismo tiempo?

Lo di rápidamente, y descubrí que cuando añadía el resultado extra, mi AVCaptureVideoDataOutput dejaba de recibir información.

Si puedo ponerlo en funcionamiento, espero que signifique que simplemente puedo usar la segunda salida para grabar video a altas velocidades de cuadro, y hacer un postproceso en el video después de que el usuario haya dejado de grabar.

Cualquier ayuda será muy apreciada.

+0

¿Estaba usted usando AVAssetWriter para escribir la imagen en un MOV/MP4? Utilizo un motor de procesamiento de imágenes OpenGL personalizado y todavía puedo grabar a 30 fps. Supuse que CoreImage tendría respaldo OpenGL para mayor eficiencia. Sospecho que lo que te frena es la visualización de las imágenes. ¿Estás usando OpenGL para renderizar las imágenes, o estás usando alguna otra API (posiblemente basada en CPU)? –

+0

¿Encontró una solución viable? – user454083

Respuesta

3

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

Ver: AVCamDemo

  1. capturar información por medio AVCaptureVideoDataOutput.
  2. Crea una nueva cola de despacho antes de grabar, ej. recordingQueue: recordingQueue = dispatch_queue_create("Movie Recording Queue", DISPATCH_QUEUE_SERIAL);
  3. En el captureOutput: didOutputSampleBuffer: fromConnection: delegar método, capturar la samplebuffer, retenerlo, y en la cola de la grabación , escribirlo 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"); 
            } 
           } 
          } 
         } 
        } 
    
+0

por favor, conviértase en Swift 4 – user924

Cuestiones relacionadas