2017-02-07 2 views
2

Используя следующий код в моем приложении, который совершал тихий штраф рисовать CIImage на GLKView снова и снова, как получил от AVCaptureOutput -didOutputSampleBuffer, пока я не использовал IOS < = 10.1. *Не удалось нарисовать CIImage на GLKView после нескольких кадров с момента обновления до iOS 10.2?

После обновления устройства для IOS 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 ссылкаhttp://imgur.com/a/u6Vyo из VM Tracker и OpenGL ES инструментов результат. Поймите, это легко понять. Благодарю.

+0

Что произойдет, если вы обойдете обработку CIFilter? –

+0

Хорошо, я прошел pixelbuffer, как и в glkview, и это не сработало или не имеет никакого эффекта. Но почему так получилось? – khunshan

ответ

1

Ваша реализация рендеринга GLKView выглядит хорошо, проблема, похоже, связана с объемом обработки, которую вы делаете на PixelBuffer после преобразования его в CIImage.

Также ссылка, которую вы поделили, показывает, что GLKView не может правильно подготовить объект VideoTexture, скорее всего из-за перегрузки памяти, создаваемой на каждой итерации. Вам нужно оптимизировать эту обработку CIFilter.

+0

Означает ли это, что я не могу использовать некоторые фильтры. Я посмотрел на CIFunhouse, они реализуют почти все фильтры Core Image, но ..... смущены. – khunshan

+0

Проверьте с разрешением вашего PixelBuffer, если он такой же, как в CIFunhouse, более чем каждый CIFilters не может применяться с частотой 24 или 30 кадров в секунду и поэтому не подходит для видео с более высоким разрешением, особенно в прошлом году или в секунде летних устройств iOS. –

+0

Каким образом я могу поместить все фильтры в рабочее состояние. Должен ли я уменьшать или использовать низкий пресет? – khunshan

Смежные вопросы