内存使用AVCaptureSession保持增长

时间:2015-06-16 14:28:43

标签: ios video avfoundation avcapture

这是我的代码。我在一个干净的新Xcode项目中使用这样的代码,内存使用是稳定的。但是在我公司的应用程序中,内存消耗每7秒钟就会持续增长,最终应用程序崩溃了。

我使用

模拟视频缓冲处理算法
for(int volatile  i = 0; i < 100000000; i++){}

我将setAlwaysDiscardsLateVideoFrames设置为YES。

奇怪的事情: 1.在测试应用程序中,内存保持正常。 2.在我公司的应用中,内存在iPhone5s(8.3)上不断增长,但在iPhone5(8.2)上却没有。 3.删除didOutputSampleBuffer中的for循环,我公司的应用程序也能很好地运行而不会增加内存。

总而言之,如果我在缓冲区回调函数中执行一个耗时的算法,并且只在我公司的应用程序中,内存不断增长。在带有活动监视器的乐器上,我可以看到内存在增长。但我看不到分配工具的分配细节。它似乎是CG栅格数据。

-(BOOL) setupAVCapture{
    session = [AVCaptureSession new];
    [session setSessionPreset:AVCaptureSessionPreset640x480];

    AVCaptureDevicePosition desiredPosition = AVCaptureDevicePositionFront;

    for (AVCaptureDevice *d in [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo]) {
        if ([d position] == desiredPosition) {
            [session beginConfiguration];
            AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:d error:nil];
            for (AVCaptureInput *oldInput in [ session inputs]) {
                [ session removeInput:oldInput];
            }
            [ session addInput:input];
            [ session commitConfiguration];
            break;
        }
    }

    // Make a video data output
    videoDataOutput = [AVCaptureVideoDataOutput new];

    // we want BGRA, both CoreGraphics and OpenGL work well with 'BGRA'
    NSDictionary *rgbOutputSettings = [NSDictionary dictionaryWithObject:
                                       [NSNumber numberWithInt:kCVPixelFormatType_32BGRA] forKey:(id)kCVPixelBufferPixelFormatTypeKey];
    [videoDataOutput setVideoSettings:rgbOutputSettings];
    [videoDataOutput setAlwaysDiscardsLateVideoFrames:YES]; // discard if the data output queue is blocked (as we process the still image)
    videoDataOutputQueue = dispatch_queue_create("MYFDVideoDataOutputQueue", DISPATCH_QUEUE_SERIAL);
    [videoDataOutput setSampleBufferDelegate:self queue:videoDataOutputQueue];

    if ( [session canAddOutput:videoDataOutput] )
        [session addOutput:videoDataOutput];
    [[videoDataOutput connectionWithMediaType:AVMediaTypeVideo] setEnabled:YES];

    [session startRunning];

    return YES;
}

#pragma mark delegate

- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection
{
    CFRetain(sampleBuffer);
    for(int volatile  i = 0; i < 100000000; i++){}
    CFRelease(sampleBuffer);
}

0 个答案:

没有答案