2017-02-07 1 views
2

. *iOS 10.2로 업데이트 된 후 몇 프레임이 지나도 GLKView에 CIImage를 그릴 수 없습니까? 나는 아이폰 OS에게 < = 10.1을 사용하여 때까지 AVCaptureOutput <code>-didOutputSampleBuffer</code>에서 받았다으로 또 다시 GLKView에 CIImage을 그릴 조용한 벌금을 수행 한 내 응용 프로그램의 코드를 다음 사용

아이폰 OS 10.2.1에 장치를 업데이트 한 후 그것은 작동을 멈췄다. 몇 가지 프레임을 호출하는 중입니다. 응용 프로그램이 메모리 부족 경고로 충돌합니다. iOS 10.1.1 이하에서는 iPhone 5S와 같은 구형 장치에서도 부드럽게이 응용 프로그램을 실행합니다.

[_glkView bindDrawable]; 

if (self.eaglContext != [EAGLContext currentContext]) 
[EAGLContext setCurrentContext:self.eaglContext]; 

glClearColor(0.0, 0.0, 0.0, 1.0); 
glClear(GL_COLOR_BUFFER_BIT); 

glEnable(GL_BLEND); 
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); 

if (ciImage) { 
    [_ciContext drawImage:ciImage inRect:gvRect fromRect:dRect]; 
} 

[_glkView display]; 

이것은 CIImage를 만드는 방법입니다.

- (CIImage*)ciImageFromPixelBuffer:(CVPixelBufferRef)pixelBuffer ofSampleBuffer:(CMSampleBufferRef)sampleBuffer { 
CIImage *croppedImage   = nil; 

CFDictionaryRef attachments  = CMCopyDictionaryOfAttachments(kCFAllocatorDefault, sampleBuffer, kCMAttachmentMode_ShouldPropagate); 
CIImage *ciImage    = [CIImage imageWithCVPixelBuffer:pixelBuffer options:(NSDictionary *)attachments]; 

if (attachments) 
    CFRelease(attachments); 

croppedImage = ciImage; 


    CIFilter *scaleFilter = [CIFilter filterWithName:@"CILanczosScaleTransform"]; 
    [scaleFilter setValue:croppedImage forKey:@"inputImage"]; 
    [scaleFilter setValue:[NSNumber numberWithFloat:self.zoom_Resize_Factor == 1 ? 0.25 : 0.5] forKey:@"inputScale"]; 
    [scaleFilter setValue:[NSNumber numberWithFloat:1.0] forKey:@"inputAspectRatio"]; 
    croppedImage = [scaleFilter valueForKey:@"outputImage"]; 


    NSDictionary *options = @{(id)kCIImageAutoAdjustRedEye : @(false)}; 

    NSArray *adjustments = [ciImage autoAdjustmentFiltersWithOptions:options]; 
    for (CIFilter *filter in adjustments) { 
     [filter setValue:croppedImage forKey:kCIInputImageKey]; 
     croppedImage = filter.outputImage; 
    } 

CIFilter *selectedFilter = [VideoFilterFactory getFilterWithType:self.selectedFilterType]; //This line needs to be removed from here 

croppedImage = [VideoFilterFactory applyFilter:selectedFilter OnImage:croppedImage]; 

CVPixelBufferUnlockBaseAddress(pixelBuffer, 0); 

return croppedImage; 
} 

여기 imgur 링크 VM 추적기와 OpenGL ES 악기의 http://imgur.com/a/u6Vyo이 될입니다. 그것을 이해하기 쉽게 만듭니다. 감사.

+0

CIFilter 관련 처리를 생략하면 어떻게됩니까? –

+0

좋아, glkview와 마찬가지로 pixelbuffer를 전달했지만 크래시가 발생하지 않았거나 효과가 없습니다. 그런데 왜 그렇게 된거야? – khunshan

답변

1

GLKView 렌더링 구현이 괜찮아 보입니다. PixelBuffer에서 CIImage로 변환 한 후 처리하는 양이 문제가되는 것 같습니다.

또한 공유 한 Imgur 링크는 GLKView가 VideoTexture 개체를 올바르게 준비 할 수 없다는 것을 보여줍니다. 대부분의 경우 각 반복에서 메모리 오버로드가 발생했기 때문일 수 있습니다. 이 CIFilter 프로세싱을 최적화해야합니다.

+0

필터를 사용할 수 없다는 뜻입니까? CIFunhouse에서 Core Image 필터를 거의 구현하고 있지만 혼란 스러웠습니다. – khunshan

+0

PixelBuffer의 해상도가 CIFunhouse와 동일하면 CIFunter를 초당 24 프레임 또는 30 프레임에 적용 할 수 없으므로 더 높은 해상도의 비디오, 특히 작년 또는 두 번째 마지막 비디오에 적합하지 않습니다 iOS 기기 –

+0

모든 필터를 작동 상태로 유지하는 방법은 무엇입니까? 축소하거나 낮은 사전 설정을 사용해야합니까? – khunshan

관련 문제