업데이트] 답변
내 이전 방법이 작동하는 동안, 나는 코드를 단순화하기 위해 그것을 조정할 수있었습니다. 그것은 또한 약간 더 빠르게 실행되는 것 같습니다.
samplePixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
CVPixelBufferLockBaseAddress(samplePixelBuffer, 0); // NOT SURE IF NEEDED // NO PERFORMANCE IMPROVEMENTS IF REMOVED
NSDictionary *options = [NSDictionary dictionaryWithObject:(__bridge id)rgbColorSpace forKey:kCIImageColorSpace];
outputImage = [CIImage imageWithCVPixelBuffer:samplePixelBuffer options:options];
//-----------------
// FILTER OUTPUT IMAGE
@autoreleasepool {
outputImage = [self applyEffectToCIImage:outputImage dict:dict];
}
CVPixelBufferUnlockBaseAddress(samplePixelBuffer, 0); // NOT SURE IF NEEDED // NO PERFORMANCE IMPROVEMENTS IF REMOVED
//-----------------
// RENDER OUTPUT IMAGE BACK TO PIXEL BUFFER
[self.filterContext render:outputImage toCVPixelBuffer:samplePixelBuffer bounds:[outputImage extent] colorSpace:CGColorSpaceCreateDeviceRGB()]; // DOES NOT SEEM TO WORK USING rgbColorSpace
PREVIOUS 답변
난 그냥은 A CIImage에서 픽셀 버퍼를 얻기 위해 다음과 같은 구현했습니다. 픽셀 형식이 일관성이 있는지 확인하십시오. 그렇지 않으면 색상 문제가 발생할 수 있습니다. 또한 CFD 사전은 매우 중요합니다. http://allmybrain.com/2011/12/08/rendering-to-a-texture-with-ios-5-texture-cache-api/
CFDictionaryRef empty = CFDictionaryCreate(kCFAllocatorDefault, // EMPTY IOSURFACE DICT
NULL,
NULL,
0,
&kCFTypeDictionaryKeyCallBacks,
&kCFTypeDictionaryValueCallBacks);
CFMutableDictionaryRef attributes = CFDictionaryCreateMutable(kCFAllocatorDefault,
1,
&kCFTypeDictionaryKeyCallBacks,
&kCFTypeDictionaryValueCallBacks);
CFDictionarySetValue(attributes,kCVPixelBufferIOSurfacePropertiesKey,empty);
CVPixelBufferRef pixelBuffer = NULL;
CVReturn status = CVPixelBufferCreate(kCFAllocatorDefault,
outputImage.extent.size.width,
outputImage.extent.size.height,
kCVPixelFormatType_32BGRA,
attributes,
&pixelBuffer);
if (status == kCVReturnSuccess && pixelBuffer != NULL) {
CVPixelBufferLockBaseAddress(pixelBuffer, 0); // NOT SURE IF NEEDED // KEPT JUST IN CASE
[self.filterContext render:outputImage toCVPixelBuffer:pixelBuffer bounds:[outputImage extent] colorSpace:CGColorSpaceCreateDeviceRGB()];
CVPixelBufferUnlockBaseAddress(pixelBuffer, 0); // NOT SURE IF NEEDED // KEPT JUST IN CASE
}
이 코드는 저를 위해 작동하지 않았습니다. –
이것은 매우 유용한 답변이지만 나에게 중요한 정보가 빠져 있습니다. [self.filterContext ...] 란 무엇입니까? 귀하의 코드를 올바르게 이해한다면, 이것은 내가 찾고있는 픽셀 버퍼로 CIImage를 실제로 렌더링하는 부분입니다. 그 기능을 공유 할 수 있습니까? 고맙습니다! –
@TimBull 나는 이것을 2 년이 지난 미래에 볼 수있는 누군가를 위해 알고있다 :'self.filteContext'는'CIContext' 객체입니다. 'render' 메소드는'CIImage'를'CVPixelBuffer' 객체에 렌더링합니다 : https://developer.apple.com/documentation/coreimage/cicontext/1437853-render – halileohalilei