2013-12-12 2 views
0

GPUImage에는 카메라의 프레임 스트림 (예 : 저역 통과 필터 또는 고역 통과 필터)에서만 작동하는 필터가 많이 있지만 그 중 일부는 많습니다.
나는 UIImages의 버퍼를 만들려고합니다. 고정 된 타이머를 사용하면 단 2 개의 이미지 사이에서 이들 필터를 적용 할 수 있으며 각 이미지 쌍마다 하나의 필터링 된 이미지가 생성됩니다. 뭐 그런 :
FirstImage + SecondImage -> FirstFilteredImage
SecondImage + ThirdImage -> SecondFilteredImage I 프레임 작동 필터가 GPUImageBuffer 사용하는 것으로 나타났습니다
, 그 GPUImageFilter의 서브 클래스 (대부분의 아마 상속입니다 일부 방법 및 프로토콜)은 패스 쓰루 프래그먼트 셰이더를로드합니다. 내가 이해하는 바로는 이것은 들어오는 프레임은 계속 유지하지만 이미 "텍스쳐 화 된"버퍼이며, 텍스처는 현재 컨텍스트에서 텍스처를 바인딩하여 생성됩니다.
-conserveMemoryForNextFrame 나는 달성하고자하는 것에 좋다고 들리지만 어떻게 작동하는지 알지 못했습니다.
그렇게 할 수 있습니까? 어떤 방법으로 이미지가 텍스처로 변환됩니까?GPUImage는 이미지 버퍼에 필터를 적용합니다.

+0

왜 그냥이 이미지의 각각에 대해 별도의 GPUImagePicture 인스턴스를 만든 다음 이미지의 각 쌍에 작용하는 두 개의 입력 필터를 적용? –

+0

고마워 브랜드, 지금 내가보고있어, 더 의미가 있습니다. 나중에 결과를 게시하겠습니다. – Andrea

답변

0

나는 내가 달성하고 싶은 것에 대해 뭔가를 만들었지 만, 첫 번째 예에서는 현재 필터 기능에 대한 몇 가지 의견을 오해했을 것입니다.
일부 필터는 셰이더에서 시간 변수를 고려한 일부 작업을 수행 할 수 있다고 생각했습니다. 왜냐하면 로우 패스 필터와 하이 패스 필터를 보았을 때 나는 즉시 시간을 생각했기 때문입니다. 현실은 다른 것처럼 보이지만 시간을 고려하지만 필터링 작업에 영향을 미치지는 않습니다.
나는 하나의 이미지를 저장하고 다른 타임 라인으로 재구성하여 오디오없이 비디오를 만드는 저속 애플리케이션을 개발 중이므로 이후 필터 기능은 시간의 필터 기능이 후속 작업에 적용하는 것이 재미있을 수 있다고 생각했습니다. 프레임. 이것은 내가 왜이 질문을 게시했는지에 대한 이유입니다.
지금 대답은 : 코드 조각처럼에 아직도 당신이해야 할 이미지를 이중 입력 필터를 적용하기 : 당신이 -useNextFrameForImageCapture 전화를 잊어 버린 경우

[sourcePicture1 addTarget:twoinputFilter]; 
    [sourcePicture1 processImage]; 
    [sourcePicture2 addTarget:twoinputFilter]; 
    [sourcePicture2 processImage]; 
    [twoinputFilter useNextFrameForImageCapture]; 
    UIImage * image = [twoinputFilter imageFromCurrentFramebuffer]; 

반환 된 이미지로 인해 버퍼 재사용, 전무 할 것이다 .
미래에 좋은 Brad가 이런 식으로 만들 것이라고 생각해서 GPUImagePicture 서브 클래스를 만들었습니다. kCMTimeIvalid를 적절한 메서드로 반환하는 대신 -frameTime이라는 프레임 CMTime을 포함하는 새 ivar를 반환합니다.

@interface GPUImageFrame : GPUImagePicture 
@property (assign, nonatomic) CMTime frameTime; 
@end 

@implementation GPUImageFrame 

- (BOOL)processImageWithCompletionHandler:(void (^)(void))completion; 
{ 
    hasProcessedImage = YES; 

    // dispatch_semaphore_wait(imageUpdateSemaphore, DISPATCH_TIME_FOREVER); 

    if (dispatch_semaphore_wait(imageUpdateSemaphore, DISPATCH_TIME_NOW) != 0) 
    { 
     return NO; 
    } 

    runAsynchronouslyOnVideoProcessingQueue(^{ 
     for (id<GPUImageInput> currentTarget in targets) 
     { 
      NSInteger indexOfObject = [targets indexOfObject:currentTarget]; 
      NSInteger textureIndexOfTarget = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue]; 

      [currentTarget setCurrentlyReceivingMonochromeInput:NO]; 
      [currentTarget setInputSize:pixelSizeOfImage atIndex:textureIndexOfTarget]; 
      [currentTarget setInputFramebuffer:outputFramebuffer atIndex:textureIndexOfTarget]; 
      [currentTarget newFrameReadyAtTime:_frameTime atIndex:textureIndexOfTarget]; 
     } 

     dispatch_semaphore_signal(imageUpdateSemaphore); 

     if (completion != nil) { 
      completion(); 
     } 
    }); 

    return YES; 
} 

- (void)addTarget:(id<GPUImageInput>)newTarget atTextureLocation:(NSInteger)textureLocation; 
{ 
    [super addTarget:newTarget atTextureLocation:textureLocation]; 

    if (hasProcessedImage) 
    { 
     [newTarget setInputSize:pixelSizeOfImage atIndex:textureLocation]; 
     [newTarget newFrameReadyAtTime:_frameTime atIndex:textureLocation]; 
    } 
} 
관련 문제