0

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プロパティを使用して、これらのレイヤーを適切に表示/非表示にします。

4

3 に答える 3

1

この投稿をありがとう!3時間のデバッグの後、ようやくアプリが動作するようになりました。ここで提案した2番目のアプローチを使用しましたが、うまく機能しました。

if([self.capMan.session isInterrupted]) { [self.capMan.session startRunning]; }

于 2013-04-26T04:16:57.957 に答える
0

少し苦労した後、私は別の解決策に落ち着きました。ビューをdetailViewに切り替えながら、プレビューレイヤーをメモリに保持して実行していました。ここで、previewLayerを停止し、画面から外されたときに記録セッションを完全に閉じてから、ユーザーが戻ったときに再度構築します。これにより、previewLayerの再初期化に約1秒の遅延が発生しますが、機能しており、問題ないと思います。

于 2011-10-15T01:23:16.260 に答える
0

プレビューレイヤーのセッションが実行されているかどうかを確認し、実行されていない場合は、startRunningセッションのメソッドを呼び出すことができます。

于 2012-05-15T08:26:59.167 に答える