2012-04-24 1 views
3

내가 화상 회의 응용 프로그램에서 일하고 있어요, 다음과 같은 코드가 성공적으로 스크린에 프레임을 그립니다 비디오에 CIFilter 적용 :아이폰 OS

내가 그리는 프레임에 CIFilter을 적용 할
-(int)drawFrameOnMainThread{ 
    if(mBitmapContext){ 
     if(mDisplay){ 
      CGImageRef imageRef = CGBitmapContextCreateImage(mBitmapContext); 
    #if TARGET_OS_IPHONE 
      UIImage *image = [UIImage imageWithCGImage:imageRef]; 

      [self performSelectorOnMainThread:@selector(setImage:) withObject:image waitUntilDone:YES]; 

    #elif TARGET_OS_MAC 
      [mDisplay setCurrentImage:imageRef]; 
    #endif 
      CGImageRelease(imageRef); 
     } 
    } 
    return 0; 
} 

, 그래서 코드의 iOS 섹션을 다음과 같이 수정합니다.

UIImage *image = [UIImage imageWithCGImage:imageRef]; 

     CIImage *beginImage = image.CIImage; 

     CIContext *context = [CIContext contextWithOptions:nil]; 

     CIFilter *filter = [CIFilter filterWithName:@"CISepiaTone" 
             keysAndValues: kCIInputImageKey, beginImage, 
          @"inputIntensity", [NSNumber numberWithFloat:0.8], nil]; 
     CIImage *outputImage = [filter outputImage]; 

     CGImageRef cgimg = 
     [context createCGImage:outputImage fromRect:[outputImage extent]]; 
     UIImage *newImg = [UIImage imageWithCGImage:cgimg]; 

[self performSelectorOnMainThread:@selector(setImage:) withObject:newImg waitUntilDone:YES]; 

결과적으로 내 비디오 화면이 검은 색으로 유지됩니다. 아무도 여기서 오류를 볼 수 있습니까? 필자는 지금 몇 시간 동안이 일을 끝내고 그것을 이해할 수 없다. 나는이 문제를 해결했습니다

+1

검은 화면을 지정하지 않고도 모든 종류의 작업을 수행한다고 말할 것입니다. 비디오가 우표의 크기가 아니라면 UIImage 소스 및 Core Image를 사용하는 비디오의 실제 장치에서는 엄청나게 느릴 것입니다. UIImage를왔다 갔다하면 Core Graphics 오버 헤드가 많이 발생합니다. 그런 다음 뷰에서 해당 이미지를 수동으로 다시 그려 보면 더 느려지 게됩니다. 또한, 내가 여기 벤치마킹 한 것처럼 : http://stackoverflow.com/a/6628208/19679 Core Image는 iOS에서와 같이 빠르지 않습니다. –

+0

카메라에서 이러한 비디오 프레임을 가져 오는 경우 OpenGL ES 또는 내 GPUImage 프레임 워크와 같은 것을 사용하여 효율적인 비디오 필터링 및 표시를 얻고 자 할 것입니다. 이것이 네트워크 소스에서 가져온 비디오 프레임 인 경우 조금 더 어려울 수 있지만 OpenGL ES (또는 Mac 클라이언트 용 OpenGL)를 사용하여이 프레임을 업로드하고 표시하려고 할 것입니다. –

+0

실제로 네트워크 소스에서 비디오를 가져오고 있으며 필터링을하지 않아도 성능이 뛰어납니다. ([link] (http://code.google.com/p/idoubs/)를 사용하고 있습니다.) 필터링에 대해 제안 하시겠습니까? 어쩌면 서버 쪽에서 할 수 있을까요? – Dimitar08

답변

4

는 문제는 줄에 CIImage를 초기화로했다 : 브래드으로

//Wrong 

CIImage *beginImage = image.CIImage;

//Right 
CIImage *beginImage = [CIImage imageWithCGImage:imageRef]; 

하지만, 성능이 허용되지 않습니다 말했다. 비디오는 iPad2에서 약 5 초 정도 지연됩니다. 그래서 다른 해결책을 찾아 보겠습니다. 그러나 다른 어떤 것보다 더 많은 개념 증명으로 작동하는 것을 보았습니다. :)