Как можно сохранить CMSampleBuffer в CFArrayRef (или другой контейнер), который из didOutputSampleBuffer

Я попытался сохранить CMSampleBuffer из didOutputSampleBuffer, как документирует разработчик iOS, я копирую его в CFArrayRetainCallBack, как удар:

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);
}

Я использую массив, как показано ниже:

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

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

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


person Clover.P    schedule 04.10.2016    source источник


Ответы (1)


CMSampleBufferCreateCopy является мелкой копией, согласно ответу из как глубоко скопировать пиксельный буфер

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

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

person Clover.P    schedule 08.10.2016