如何将 CMSampleBuffer 保存到来自 didOutputSampleBuffer 的 CFArrayRef(或其他容器)
How could save the CMSampleBuffer to a CFArrayRef (or other container) that from didOutputSampleBuffer
我试图从 didOutputSampleBuffer 中保存 CMSampleBuffer,作为 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);
}
有人有更好的方法或任何建议吗?
非常感谢。
CMSampleBufferCreateCopy是浅拷贝,根据
的回答
使用新的像素缓冲区重新创建样本缓冲区。然后我可以缓存样本缓冲区。
但是这样很费资源,我不能在内存中容纳太多的CMSampleBufferRef(每个大约需要3MB),而且深拷贝的过程很浪费时间。
我试图从 didOutputSampleBuffer 中保存 CMSampleBuffer,作为 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);
}
有人有更好的方法或任何建议吗?
非常感谢。
CMSampleBufferCreateCopy是浅拷贝,根据
使用新的像素缓冲区重新创建样本缓冲区。然后我可以缓存样本缓冲区。
但是这样很费资源,我不能在内存中容纳太多的CMSampleBufferRef(每个大约需要3MB),而且深拷贝的过程很浪费时间。