2016-07-26 14 views
3

Ich versuche, einen CVPixelBufferRef aus CMSampleBufferRef in Reihenfolge zu ändern, um CVPixelBufferRef zu ändern, um ein Wasserzeichen während des Betriebs zu überlagern.CMSampleBufferGetImageBuffer gibt null zurück

Ich verwende CMSampleBufferGetImageBuffer(sampleBuffer) um dies zu erreichen. Ich drucke das Ergebnis des zurückgegebenen CVPixelBufferRef, aber es ist immer Null.

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

    CVPixelBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer); 

    NSLog(@"PixelBuffer %@",pixelBuffer); 
... 

} 

Ich dort etwas, was ich vermisse?

Antwort

4

Nach stundenlangem Debugging stellt sich heraus, dass das Beispiel ein Video- oder Audio-Sample sein kann. Der Versuch, CVPixelBufferRef aus einem Audiopuffer zu holen, gibt null zurück.

Ich löste es durch Überprüfen des Probentyps, bevor Sie fortfahren. Da ich mich nicht für die Audio-Samples interessiere, komme ich einfach zurück, wenn es sich um ein Audio-Sample handelt.

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

    CVPixelBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer); 

    CMFormatDescriptionRef formatDesc = CMSampleBufferGetFormatDescription(sampleBuffer); 
    CMMediaType mediaType = CMFormatDescriptionGetMediaType(formatDesc); 

    //Checking sample type before proceeding 
    if (mediaType == kCMMediaType_Audio) 
    {return;} 

//Processing the sample... 

}