2012-04-02 2 views
3

저는 사용자 정의 무비 레코딩 응용 프로그램을 작성하고 있으며 프레임에 파일을 쓰는 데 AVAssetWriter 및 AVAssetWriterInputPixelBufferAdaptor를 구현했습니다. DataOutputDelegate 콜백에서 CIFilter를 sampleBuffer에 적용하려고합니다. 먼저 CVPixelBufferRef를 얻은 다음 CIImage를 만듭니다. 나는 다음 CIIFilter을 적용하고 결과 CIImage 잡아 : 나는 변환하는 방법에 대한 갈 것이라고 어떻게파일에 쓰기위한 CIImage에서 CVPixelBufferRef 만들기

CVPixelBufferRef pixelBuffer = (CVPixelBufferRef)CMSampleBufferGetImageBuffer(sampleBuffer); 

    CIImage *image = [CIImage imageWithCVPixelBuffer:pixelBuffer]; 
    CIFilter *hueAdjust = [CIFilter filterWithName:@"CIHueAdjust"]; 
    [hueAdjust setDefaults]; 
    [hueAdjust setValue: image forKey: @"inputImage"]; 
    [hueAdjust setValue: [NSNumber numberWithFloat: 2.094] 
       forKey: @"inputAngle"]; 

    CIImage *result = [hueAdjust valueForKey: @"outputImage"]; 

    CVPixelBufferRef newBuffer = //Convert CIImage... 

을 그 CIImage 그래서 할 수 있습니다

[self.filteredImageWriter appendPixelBuffer:newBuffer withPresentationTime:lastSampleTime]; 

답변

9

업데이트] 답변

내 이전 방법이 작동하는 동안, 나는 코드를 단순화하기 위해 그것을 조정할 수있었습니다. 그것은 또한 약간 더 빠르게 실행되는 것 같습니다.

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 

} 
+2

이 코드는 저를 위해 작동하지 않았습니다. –

+9

이것은 매우 유용한 답변이지만 나에게 중요한 정보가 빠져 있습니다. [self.filterContext ...] 란 무엇입니까? 귀하의 코드를 올바르게 이해한다면, 이것은 내가 찾고있는 픽셀 버퍼로 CIImage를 실제로 렌더링하는 부분입니다. 그 기능을 공유 할 수 있습니까? 고맙습니다! –

+1

@TimBull 나는 이것을 2 년이 지난 미래에 볼 수있는 누군가를 위해 알고있다 :'self.filteContext'는'CIContext' 객체입니다. 'render' 메소드는'CIImage'를'CVPixelBuffer' 객체에 렌더링합니다 : https://developer.apple.com/documentation/coreimage/cicontext/1437853-render – halileohalilei

관련 문제