Я снимаю видео и делаю некоторые анализы на нем в captureOutput:(AVCaptureOutput *)output didOutputSampleBuffer
делегате.но через некоторое время этот метод не вызывается.тогда вызывается captureOutput:(AVCaptureOutput *)output didDropSampleBuffer
делегат.
Когда я ничего не делаю в didOutputSampleBuffer, все в порядке.Я управляю тензорной моделью потока в этом делегате.И это вызывает проблему.
Проблема: Проблема в том, что при вызове didDropSampleBuffer
didOutputSampleBuffer больше не будет вызываться.
Мое решение: Мое решение было остановить и запустить avCaptureSession.но это вызвало дополнительное использование памяти!Что в итоге привело к сбою моего приложения.
- (void)captureOutput:(AVCaptureOutput *)output didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection
{
// ****** do heavy work in this delegate *********
graph = [TensorflowGraph new];
predictions = [graph runModelOnPixelBuffer:pixelBuffer orientation: UIDeviceOrientationPortrait CardRect: _vwRect];
}
- (void)captureOutput:(AVCaptureOutput *)output didDropSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection
{
CFTypeRef droppedFrameReason = CMGetAttachment(sampleBuffer, kCMSampleBufferAttachmentKey_DroppedFrameReason, NULL);
NSLog(@"dropped frame, reason: %@", droppedFrameReason);
}
----> пропущенный кадр, причина: OutOfBuffers
Согласно [https://developer.apple.com/library/archive/technotes/tn2445/_index.html]:
Это условие обычно вызывается тем, что клиент слишком долго удерживает буферы, и может быть смягчено путем возврата буферов поставщику.
Как я могу вернуть буфер впровайдер?
Отредактировано
После 11 раз выполнения строки CGImageRef cgImage = [context createCGImage:resized fromRect:resized.extent];
вызывается didDropSampleBuffer
.комментирование CFRelease(pixelBuffer)
не имеет разницы в результате.Означает ли это, что pixelBuffer не освобождается?
CFRetain(pixelBuffer);
CVPixelBufferLockBaseAddress(pixelBuffer, kCVPixelBufferLock_ReadOnly);
CIImage* ciImage = [[CIImage alloc] initWithCVPixelBuffer:pixelBuffer];
ciImage = [ciImage imageByCroppingToRect:cropRect];
CGAffineTransform transform = CGAffineTransformIdentity;
CGFloat angle = 0.0;
transform = CGAffineTransformRotate(transform, angle);
CIImage* resized = [ciImage imageByApplyingTransform:transform];
CIContext *context = [CIContext contextWithOptions:nil];
CGImageRef cgImage = [context createCGImage:resized fromRect:resized.extent]; // *********************************
UIImage* _res = [[UIImage alloc] initWithCGImage:cgImage];
CFRelease(pixelBuffer);
1