2016-10-04 8 views
-1

Я пытался спасти CMSampleBuffer от didOutputSampleBuffer, как документации для разработчиков IOS, скопировать его в CFArrayRetainCallBack как удар:Как можно сохранить CMSampleBuffer к CFArrayRef (или другой контейнер), что из didOutputSampleBuffer

static const void * ObjectRetainCallBack(CFAllocatorRef allocator, const void *value) { 

    CMSampleBufferRef buffer = (CMSampleBufferRef)value; 
    if (buffer) { 

     CMSampleBufferRef new = NULL; 
     OSStatus status = CMSampleBufferCreateCopy(kCFAllocatorDefault, buffer, &new); 
     if (status == noErr) { 
      return new; 
     } 
     return NULL; 

    } 
    return NULL; 
} 

static void ObjectReleaseCallBack(CFAllocatorRef allocator, const void *value) { 
    if (value) { 
     CFRelease(value); 
    } 
} 

CFMutableArrayRef CreateDispatchHoldingArray() { 
    CFArrayCallBacks callBacks = { 
     0, 
     ObjectRetainCallBack, 
     ObjectReleaseCallBack, 
     NULL, 
     NULL 
    }; 
    return CFArrayCreateMutable(kCFAllocatorDefault, 0, &callBacks); 
} 

I используйте массив, как показано ниже:

- (void) captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection { 
    CFArrayAppendValue(_pixelArray, sampleBuffer); 
} 

У кого-то есть лучший способ сделать это или любое предложение?

Большое спасибо.

ответ

0

CMSampleBufferCreateCopy неглубокое копирование, в соответствии с ответом от how to deep copy pixelbuffer

воссоздать samplebuffer с новым pixelbuffer. то я мог бы кэшировать буферы выборки.

Но так как ресурс затрат, я не могу удерживать слишком много CMSampleBufferRefs в памяти (каждый из них занимает около 3 МБ), а процесс глубокой копии - пустая трата времени.