我正在构建一个使用AVCaptureVideoPreviewLayer显示视频预览图层的应用。设置非常简单,似乎运作良好:
newCaptureVideoPreviewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:[[self captureManager] session]];
CGRect tmpRect = CGRectInset(recordingView.bounds, 3, 3);
[newCaptureVideoPreviewLayer setFrame:CGRectInset(tmpRect, 3, 3)];
CALayer *viewLayer = [recordingView layer];
[newCaptureVideoPreviewLayer setVideoGravity:AVLayerVideoGravityResizeAspectFill];
[viewLayer insertSublayer:newCaptureVideoPreviewLayer below:[[viewLayer sublayers] objectAtIndex:0]];
[self setCaptureVideoPreviewLayer:newCaptureVideoPreviewLayer];
[newCaptureVideoPreviewLayer release];
稍后,我有一种情况,即用户可以使用MPMoviePlayerController将包含预览图层的视图与显示包含录制视频的视图的视图交换。我这样设置(前面的代码块来自UIViewController的viewDidLoad:方法,这是在同一个控制器中,作为更改视图的方法的一部分:
MPMoviePlayerController * player = [[MPMoviePlayerController alloc] initWithContentURL:url];
[player.view setFrame:[detailView playerView].bounds]; // player's frame must match parent's
player.view.backgroundColor = [UIColor clearColor];
player.shouldAutoplay = NO;
player.fullscreen = NO;
player.scalingMode = MPMovieScalingModeAspectFit;
[[detailView playerView] addSubview:player.view];
麻烦的是,当MPMoviePlayerController被添加到视图中时,预览会“冻结” - 它会在输入此代码块之前显示摄像机前面的最后一帧。我没有收到错误消息,我找不到任何问题来源。
我注意到我没有发布播放器变量。任何这样做的尝试都会破坏播放器,包括自动释放它,或尝试在通知回调中释放它。但是,我不认为这个问题(虽然本身可能存在问题)是杀死我的预览图层的来源。
我很感激您对此问题的任何见解!
更新:@boredastronaut在下面询问我如何设置视图。我有一个控制器运行所有视图。在我的应用程序中,我有预览图层,并在同一位置,包含播放器的视图。所有视图都在-loadView:中加载,我使用隐藏属性来显示/隐藏这些图层。
答案 0 :(得分:1)
感谢这篇文章!经过3个小时的调试后,我终于让我的应用程序运行了。我使用了这里建议的第二种方法,它工作得很漂亮。
if([self.capMan.session isInterrupted])
{
[self.capMan.session startRunning];
}
答案 1 :(得分:0)
经过不小的努力,我决定采用不同的解决方案。我一直在将预览图层保留在内存中并在将视图切换到detailView时运行。现在,我正在关闭previewLayer并在屏幕关闭时完全关闭录制会话,然后在用户返回时再次将其重新建立。它导致重新初始化previewLayer大约一秒钟的延迟,但它正在工作,我认为这很好。
答案 2 :(得分:0)
您可以检查预览图层的会话是否正在运行,如果没有,请调用startRunning
会话方法。