2013-09-06 5 views
7

Ich bin neu in iOS-Programmierung und Multimedia und ich ging durch ein Beispielprojekt namens RosyWriter von Apple zur Verfügung gestellt unter this link. Hier sah ich, dass im Code gibt es eine Funktion captureOutput:didOutputSampleBuffer:fromConnection im Code angegebenen Namen unter:Convert CVImageBufferRef in CVPixelBufferRef

- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection 
{ 
CMFormatDescriptionRef formatDescription = CMSampleBufferGetFormatDescription(sampleBuffer); 

if (connection == videoConnection) { 

    // Get framerate 
    CMTime timestamp = CMSampleBufferGetPresentationTimeStamp(sampleBuffer); 
    [self calculateFramerateAtTimestamp:timestamp]; 

    // Get frame dimensions (for onscreen display) 
    if (self.videoDimensions.width == 0 && self.videoDimensions.height == 0) 
     self.videoDimensions = CMVideoFormatDescriptionGetDimensions(formatDescription); 

    // Get buffer type 
    if (self.videoType == 0) 
     self.videoType = CMFormatDescriptionGetMediaSubType(formatDescription); 

    CVImageBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer); 

    // Synchronously process the pixel buffer to de-green it. 
    [self processPixelBuffer:pixelBuffer]; 

    // Enqueue it for preview. This is a shallow queue, so if image processing is taking too long, 
    // we'll drop this frame for preview (this keeps preview latency low). 
    OSStatus err = CMBufferQueueEnqueue(previewBufferQueue, sampleBuffer); 
    if (!err) {   
     dispatch_async(dispatch_get_main_queue(), ^{ 
      CMSampleBufferRef sbuf = (CMSampleBufferRef)CMBufferQueueDequeueAndRetain(previewBufferQueue); 
      if (sbuf) { 
       CVImageBufferRef pixBuf = CMSampleBufferGetImageBuffer(sbuf); 
       [self.delegate pixelBufferReadyForDisplay:pixBuf]; 
       CFRelease(sbuf); 
      } 
     }); 
    } 
} 

CFRetain(sampleBuffer); 
CFRetain(formatDescription); 
dispatch_async(movieWritingQueue, ^{ 

    if (assetWriter) { 

     BOOL wasReadyToRecord = (readyToRecordAudio && readyToRecordVideo); 

     if (connection == videoConnection) { 

      // Initialize the video input if this is not done yet 
      if (!readyToRecordVideo) 
       readyToRecordVideo = [self setupAssetWriterVideoInput:formatDescription]; 

      // Write video data to file 
      if (readyToRecordVideo && readyToRecordAudio) 
       [self writeSampleBuffer:sampleBuffer ofType:AVMediaTypeVideo]; 
     } 
     else if (connection == audioConnection) { 

      // Initialize the audio input if this is not done yet 
      if (!readyToRecordAudio) 
       readyToRecordAudio = [self setupAssetWriterAudioInput:formatDescription]; 

      // Write audio data to file 
      if (readyToRecordAudio && readyToRecordVideo) 
       [self writeSampleBuffer:sampleBuffer ofType:AVMediaTypeAudio]; 
     } 

     BOOL isReadyToRecord = (readyToRecordAudio && readyToRecordVideo); 
     if (!wasReadyToRecord && isReadyToRecord) { 
      recordingWillBeStarted = NO; 
      self.recording = YES; 
      [self.delegate recordingDidStart]; 
     } 
    } 
    CFRelease(sampleBuffer); 
    CFRelease(formatDescription); 
}); 
} 

hier eine Funktion pixelBufferReadyForDisplay genannt wird aufgerufen, die einen Parameter vom Typ CVPixelBufferRef

Prototyp pixelBufferReadyForDisplay erwartet

- (void)pixelBufferReadyForDisplay:(CVPixelBufferRef)pixelBuffer; 

Aber im obigen Code beim Aufruf dieser Funktion übergibt es die Variable pixBuf wh Ich bin vom Typ

Also meine Frage ist, dass es nicht erforderlich ist, eine Funktion oder Typumwandlung zu verwenden, um eine CVImageBufferRef in CVPixelBufferRef zu konvertieren oder wird dies implizit durch den Compiler getan?

Danke.

Antwort

20

Wenn Sie eine Suche auf CVPixelBufferRef in der Xcode-Dokumentation zu tun, finden Sie wie folgt vor:

typedef CVImageBufferRef CVPixelBufferRef; 

So ein CVImageBufferRef ein Synonym für eine CVPixelBufferRef ist. Sie sind austauschbar.

Sie suchen einen ziemlich knorrigen Code. RosyWriter und eine andere Beispielanwendung namens "Chromakey" führen eine ziemlich niedrige Verarbeitung von Pixelpuffern durch. Wenn Sie neu in der iOS-Entwicklung und neu in Multimedia sind, möchten Sie vielleicht nicht so tief graben, so schnell. Es ist ein bisschen wie ein Medizinstudent im ersten Jahr, der versucht, eine Herz-Lungen-Transplantation durchzuführen.

+0

Warum können Sie einen CImage von einem CVPixelBuffer auf iOS, aber nicht auf OSX erstellen? CIImage (CVPixelBuffer: currPixelBuffer) funktioniert auf iOS, aber nicht auf OSX. CIImage (CVImageBuffer: currPixelBuffer) funktioniert unter OSX. – Adam

+0

Zwischen den Plattformen gibt es einige Unterschiede beim Datentyp. Manchmal gibt es keinen guten Grund dafür. –