AVCaptureVideoPreviewLayer随着时间的推移运行速度变慢

问题描述 投票:0回答:1

我有一个UIViewController,在其中我在init方法上设置了一个AVCaptureVideoPreviewLayer来拍照。拍摄照片后,我关闭了UIViewController。

每次打开此UIViewController时,Ipad的运行速度都会变慢,直到崩溃为止。我收到内存警告,因此我认为它不是免费的,另一方面,我正在使用ARC,因此我支持每次我关闭UIViewController都会释放内存。

这是UIViewController的init方法上的代码:

    session = [[AVCaptureSession alloc] init];
    session.sessionPreset = AVCaptureSessionPresetMedium;

    AVCaptureVideoPreviewLayer *captureVideoPreviewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:session];
    captureVideoPreviewLayer.affineTransform = CGAffineTransformMakeRotation(M_PI+M_PI_2);
    captureVideoPreviewLayer.frame = CGRectMake(45, 55, 512, 387);
    [self.cameraPlace.layer addSublayer:captureVideoPreviewLayer];


    NSArray *cameras=[AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];
    AVCaptureDevice *device = [cameras objectAtIndex:1];

    NSError *error = nil;
    AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error:&error];
    [session addInput:input];

    stillImageOutput = [[AVCaptureStillImageOutput alloc] init];
    NSDictionary *outputSettings = [[NSDictionary alloc] initWithObjectsAndKeys: AVVideoCodecJPEG, AVVideoCodecKey, nil];
    [stillImageOutput setOutputSettings:outputSettings];

    [session addOutput:stillImageOutput];

    [session startRunning];

我有什么问题吗?还是您有任何线索?

ios ios6 uiviewcontroller avcapturesession
1个回答
0
投票

我遇到了同样的问题,因为我正在添加带有已添加会话的层。

self.captureVideoPreviewLayer = [AVCaptureVideoPreviewLayer 
                layerWithSession:self.session];

请在上面的行上设置断点,您会发现需要3-4秒才能继续。有时会创建内存警告,有时则不会。因此只需添加一下,检查它是否已经添加,如下所示。

NSError *error;
[self.deviceCamera lockForConfiguration:&error];

if (self.session == nil)
{
    self.session = [[AVCaptureSession alloc] init];  
    self.captureVideoPreviewLayer = [AVCaptureVideoPreviewLayer 
    layerWithSession:self.session];
    CGRect screenBounds = [[UIScreen mainScreen]bounds];
    self.captureVideoPreviewLayer.frame = screenBounds;
    self.captureVideoPreviewLayer.videoGravity = 
    AVLayerVideoGravityResizeAspectFill; //  to fill the camera fullscreen view
    self.userInteractionEnabled = YES;

    if ([self.session canAddInput:_input]) {
        [self.session addInput:_input];
     }
}

[self.session startRunning];

[self.layer addSublayer:self.captureVideoPreviewLayer];

if (self.stillImageOutput ==  nil)
{
    self.stillImageOutput = [[AVCaptureStillImageOutput alloc] init];
    NSDictionary *outputSettings = [[NSDictionary alloc] initWithObjectsAndKeys: AVVideoCodecJPEG, AVVideoCodecKey, nil];
    [self.stillImageOutput setOutputSettings:outputSettings];
    NSString* preset = 0;
    if (!preset) {
        preset = AVCaptureSessionPresetPhoto;
    }

    if ([self.session canSetSessionPreset:preset]) {

        self.session.sessionPreset = preset;
    }


    if ([self.session canAddOutput:self.stillImageOutput]) {
        [self.session addOutput:self.stillImageOutput];
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.