didDropSampleBuffer очень часто вызывается в iOS - PullRequest
3 голосов
/ 26 марта 2019

Я снимаю видео и делаю некоторые анализы на нем в 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...