gpt4 book ai didi

ios - 带有 ARC 的 iOS5 modalviewcontroller 中的 AVCaptureSession

转载 作者:可可西里 更新时间:2023-11-01 04:40:22 25 4
gpt4 key购买 nike

我正在疯狂地尝试让 AVCaptureSession(在 View Controller 中)在我的项目中呈现和关闭。我目前使用的是 iOS5.1 并启用了 ARC。

第一次显示 View Controller 并启动 session 时,我可以让它正常工作,但是当我关闭并第二次显示时, session 将不会启动。我订阅了“AVCaptureSessionRuntimeErrorNotification”通知并收到以下错误:

“错误域=AVFoundationErrorDomain 代码=-11819“无法完成操作”UserInfo=0x1a4020 {NSLocalizedRecoverySuggestion=稍后重试。, NSLocalizedDescription=无法完成操作}”

我假设某些东西在我的 session 中没有被正确释放,但是对于 ARC 没有释放,我而是将所有要释放的东西都设置为 nil。

我的 viewDidLoad 方法基本上只是触发 initCamera

初始化相机方法:

AVCaptureSession *tmpSession = [[AVCaptureSession alloc] init];

session = tmpSession;
session.sessionPreset = AVCaptureSessionPresetMedium;
captureVideoPreviewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:session];

captureVideoPreviewLayer.frame = self.vImagePreview.bounds;
[self.vImagePreview.layer addSublayer:captureVideoPreviewLayer];
rearCamera = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];

NSError *error = nil;
input = [AVCaptureDeviceInput deviceInputWithDevice:rearCamera error:&error];

if (!input) {
// Handle the error appropriately.
NSLog(@"ERROR: trying to open camera: %@", error);
}

[session addInput:input];

videoDataOutput = [[AVCaptureVideoDataOutput alloc] init];
NSDictionary *outputSettings = [[NSDictionary alloc] initWithObjectsAndKeys: [NSNumber numberWithInt:kCVPixelFormatType_32BGRA], kCVPixelBufferPixelFormatTypeKey, nil];
[videoDataOutput setVideoSettings:outputSettings];
[videoDataOutput setAlwaysDiscardsLateVideoFrames:YES];


queue = dispatch_queue_create("cameraQueue", DISPATCH_QUEUE_SERIAL);
[videoDataOutput setSampleBufferDelegate:self queue:queue];
dispatch_release(queue);

[session addOutput:videoDataOutput];

NSNotificationCenter *notify =
[NSNotificationCenter defaultCenter];

[notify addObserver: self
selector: @selector(onVideoError:)
name: AVCaptureSessionRuntimeErrorNotification
object: session];


[session startRunning];


[rearCamera lockForConfiguration:nil];
rearCamera.whiteBalanceMode = AVCaptureWhiteBalanceModeContinuousAutoWhiteBalance;
rearCamera.exposureMode = AVCaptureExposureModeContinuousAutoExposure;
rearCamera.focusMode = AVCaptureFocusModeContinuousAutoFocus;
[rearCamera unlockForConfiguration];

方法

captureOutput:(AVCaptureOutput *)captureOutputdidOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer 来自连接:(AVCaptureConnection *)连接

第一次显示模态视图 Controller 时调用没有问题,但在第二次尝试时此方法停止调用(因为 session 未启动)

为了清理,我在关闭之前从我的父 View Controller 调用 stopSession 并执行以下操作:

if ([session isRunning]) {
[session removeInput:input];
[session stopRunning];

[vImagePreview removeFromSuperview];
vImagePreview = nil;


input = nil;
videoDataOutput = nil;
captureVideoPreviewLayer = nil;
session = nil;

queue = nil;


}

我觉得我已经尝试了各种各样的事情,例如在队列上执行 dispatch_sync(queue, ^{}) 以等待它被刷新,但这似乎没有什么不同(调用时dispatch_sync 我在我的初始化相机方法中删除了 dispatch_release 调用)。我也尝试过使用另一个问题中建议的 dispatch_set_finalizer_f(queue, capture_cleanup) 方法,但我不知道在 capture_cleanup 方法中实际需要做什么,因为我找到的所有示例都是非 ARC 代码,它们调用 release on指向自身的指针。我还梳理了我可以从 Apple(SquareCam 和 AVCam)找到的所有示例代码,但这些也是非 ARC 的。任何帮助将不胜感激。

最佳答案

我意识到我正在对我的后置摄像头执行 setFocusPointOfInterest 并且由于某种原因它在重新启动时破坏了 session 。我不明白为什么会导致这个问题,但我会调查的。

关于ios - 带有 ARC 的 iOS5 modalviewcontroller 中的 AVCaptureSession,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9856114/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com