AVCaptureVideoPreviewLayer 运行速度随时间变慢
Posted
技术标签:
【中文标题】AVCaptureVideoPreviewLayer 运行速度随时间变慢【英文标题】:AVCaptureVideoPreviewLayer running slower with time 【发布时间】:2013-12-03 22:35:28 【问题描述】:我有一个 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];
我有什么问题吗?或者你有什么线索吗?
【问题讨论】:
你是如何创建 VC 的?你有财产吗?你每次都创建一个新的 VC 吗? 您在 VC 中时是否收到内存警告?如果打开一次会怎样? 每次我需要拍照时,我都会创建一个 ViewController:CameraViewController *camera = [[CameraViewController alloc] initWithBlackboard:self.farm mode:3]; 我在 ViewController 打开时收到内存警告,如果我只打开一次 ViewController 一切正常 您是否添加了一些对您的 VC 的引用?听起来 VC 没有被释放。 【参考方案1】:我遇到了同样的问题,因为我正在添加一个已添加会话的图层。
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];
objective-ciosavcapturesession
【讨论】:
以上是关于AVCaptureVideoPreviewLayer 运行速度随时间变慢的主要内容,如果未能解决你的问题,请参考以下文章