2010-12-17 7 views
2

Ich habe diese App die Aufzeichnungen Video und ich muss eine Methode jedes Mal, wenn ein Rahmen ergriffen wird. Nachdem ich meinen Kopf an die Wand geschlagen hatte, beschloss ich, Folgendes zu versuchen: Erstelle eine Dispatch-Warteschlange, da ich ein Video von der Ausgabe nehmen würde, nur um eine Methode aufzurufen, wenn der Frame von der Kamera aufgenommen wird.iphone. Verarbeitung von Frames, die von der Kamera aufgezeichnet werden

Ich versuche, einen Abschnitt von Code zu verstehen, der von Apple erstellt wurde, um Videos aufzuzeichnen, um herauszufinden, wie ich die Dispatch-Warteschlange hinzufügen sollte. Dies ist der Apple-Code und der Abschnitt, der zwischen Sternchen markiert ist, ist was ich hinzugefügt habe, um die Warteschlange zu erstellen. Es kompiliert ohne Fehler, aber captureOutput: didOutputSampleBuffer: fromConnection: wird nie aufgerufen.

Was ich brauche, ist nur eine Methode, wo ich jeden Rahmen verarbeiten kann, der gerade aufgezeichnet wird.

- (void)captureOutput:(AVCaptureOutput *)captureOutput 
     didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer 
     fromConnection:(AVCaptureConnection *)connection 

Jedes Mal, wenn ein neuer Rahmen erfasst wird:

dank

Antwort

2

sich als Delegierter gesetzt haben, erhalten Sie einen Anruf erhalten. Sie können den Code eingeben, den Sie wollen - seien Sie vorsichtig, weil Sie nicht im Hauptthread sind. Es ist wahrscheinlich am sichersten, eine schnelle [target performSelectorOnMainThread:@selector(methodYouActuallyWant)] in -captureOutput:didOutputSampleBuffer:fromConnection: zu tun.

Zusatz: Ich verwende Folgendes als Setup in meinem Code, und das führt erfolgreich zum Aufruf der Delegate-Methode. Ich kann keinen wesentlichen Unterschied zwischen dem und dem, was Sie verwenden, erkennen.

- (id)initWithSessionPreset:(NSString *)sessionPreset delegate:(id <AAVideoSourceDelegate>)aDelegate 
{ 

#ifndef TARGET_OS_EMBEDDED 
    return nil; 
#else 

    if(self = [super init]) 
    { 
     delegate = aDelegate; 

     NSError *error = nil; 

     // create a low-quality capture session 
     session = [[AVCaptureSession alloc] init]; 
     session.sessionPreset = sessionPreset; 

     // grab a suitable device... 
     device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; 

     // ...and a device input 
     AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error:&error]; 

     if(!input || error) 
     { 
      [self release]; 
      return nil; 
     } 
     [session addInput:input]; 

     // create a VideDataOutput to route output to us 
     AVCaptureVideoDataOutput *output = [[AVCaptureVideoDataOutput alloc] init]; 
     [session addOutput:[output autorelease]]; 

     // create a suitable dispatch queue, GCD style, and hook self up as the delegate 
     dispatch_queue_t queue = dispatch_queue_create("aQueue", NULL); 
     [output setSampleBufferDelegate:self queue:queue]; 
     dispatch_release(queue); 

     // set 32bpp BGRA pixel format, since I'll want to make sense of the frame 
     output.videoSettings = 
      [NSDictionary 
       dictionaryWithObject:[NSNumber numberWithInt:kCVPixelFormatType_32BGRA] 
       forKey:(id)kCVPixelBufferPixelFormatTypeKey]; 

    } 

    return self; 
#endif 
} 

- (void)start 
{ 
    [session startRunning]; 
} 

- (void)stop 
{ 
    [session stopRunning]; 
} 
+0

Danke. Ist der von mir hinzugefügte Code korrekt? In der Tat spreche ich über diese Frage, ich meine, ich habe diese Zeilen hinzugefügt, ich habe die Methode, die du erwähnst, aber sie wird nie aufgerufen. Ich nahm an, dass die zweite Zeile, die ich hinzugefügt habe, den Delegierten setzte, aber da die Methode nicht aufgerufen wird, weiß ich nicht mehr. – SpaceDog

+0

Entschuldigung - Sie haben recht, dass ich Ihre Frage auf spektakuläre Weise nicht beantwortet habe. Der angezeigte Code sieht korrekt aus, daher nahm ich an, dass das Problem in der nicht gezeigten Delegate-Methode liegt. Ich bearbeite meinen Beitrag und füge genau das hinzu, was ich in meinem Projekt bearbeitet habe. – Tommy

+0

danktsss !!!!!!!!!! – SpaceDog

0
// create a suitable dispatch queue, GCD style, and hook self up as the delegate 
     dispatch_queue_t queue = dispatch_queue_create("aQueue", NULL); 
     [output setSampleBufferDelegate:self queue:queue]; 
     dispatch_release(queue); 

auch sehr wichtig in

- (void)captureOutput:(AVCaptureOutput *)captureOutput 
didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer 
     fromConnection:(AVCaptureConnection *)connection 

sicher sein, ein

NSAutoreleasePool * Pool = [[NSAutoreleasePool alloc] init] zu setzen; am anfang und einem [pool drain] am ende wird sonst nach zu vielen prozessen abstürzen.

Verwandte Themen