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は、ここでビューを設定する方法を以下に尋ねました。1つのコントローラーですべてのビューを実行しています。私のアプリにはプレビューレイヤーがあり、同じ場所にプレーヤーを含むビューがあります。すべてのビューは-loadView:にロードされ、hiddenプロパティを使用して、これらのレイヤーを適切に表示/非表示にします。