0

AVCaptureVideoPreviewLayer를 사용하여 비디오 미리보기 레이어를 보여주는 앱을 제작하고 있습니다. 그의 설정은 꽤 솔직이며, 잘 작동하는 것 같다 :MPMoviePlayerController 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를 사용하여 녹화 된 비디오를 재생합니다. 방법이 뷰 변경에 대한 자신의 방법의 일환으로, 동일한 컨트롤러에 있습니다 :

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]; 

말썽 때이다 그렇게 (이전 코드 블록이있는 UIViewController의 viewDidLoad에에서 오는처럼 나는 그것을 설정 MPMoviePlayerController가 뷰에 추가되고 미리보기가 "고정"됩니다.이 코드 블록을 입력하기 전에 카메라 앞에 있었던 마지막 프레임이 표시됩니다. 오류 메시지가 나타나지 않으며 어떤 소스도 찾을 수 없습니다.

나는 플레이어 변수를 공개하지 않는다는 점에 유의하십시오. 자동 재생 기능을 포함하여 플레이어를 깨뜨리거나이를 해제하려고 시도하는 플레이어의 시도가 중단됩니다. 통지 콜백. 그러나, 나는 그 문제 (잠재적으로 자체적으로 문제는 있지만)가 내 미리보기 레이어를 죽이는 원인이라고 생각하지 않습니다.

이 문제에 대해 통찰력을 주셔서 감사합니다.

업데이트 : @boredastronaut는 여기에서 뷰를 설정하는 방법을 아래에서 질문했습니다. 모든 뷰를 실행하는 컨트롤러가 하나 있습니다. 내 응용 프로그램에서는 미리보기 레이어가 있고 동일한 지점에 플레이어가 포함 된보기가 있습니다. 모든 뷰는 -loadView :에로드되며 속성을 사용하여이 레이어를 적절히 표시하거나 숨 깁니다.

+0

그것은 당신이 컨트롤러 계층 구조에 추가 한 경우가 아니면, (컨트롤러입니다) 플레이어를 출시되어서는 안된다는 사실입니다,하지만 당신은 단지 그것을 누설하고 싶지 않아요. 아마 당신은 사용자 정의보기 컨트롤러 또는 어쩌면 애플 리케이션 대리인의 속성을 만들고 싶어. 플레이어보기에서 미리보기 (미리보기 레이어가 포함 된보기)를 교체하는 방법에 대해 잘 모르겠습니다. 미리보기와 플레이어보기가 모두 세부보기의 하위보기입니까? 뷰 계층 구조가 어떻게 정렬되어 있는지는 명확하지 않습니다. –

+0

비교를 위해 필자는 잠시 동안 MPMoviePlayerController 대신 AVPlayerLayer를 사용하고 영화를 시작/중지하는 사용자 지정 단추를 사용하여 잠시 썼던 테스트 응용 프로그램을 가지고 있습니다. 두 개의 탭이있는 탭보기가 있습니다. 하나는 플레이어 용이고 다른 하나는 미리보기/레코드 용입니다. 미리보기를 설정 했어. 플레이어 레이어를 설정하는 것은 ... 글쎄, 나는 그것을 코멘트에 넣을 수는 없지만, AV Foundation Programming Guide는 그것을 통해 독자를 안내한다. –

답변

0

고투의 작은 양의 후, 나는 다른 해결책을 해결했다. viewView를 detailView로 전환하면서 미리보기 레이어를 메모리에 유지하고 실행했습니다. 이제 previewLayer를 닫고 녹화 세션을 닫을 때 화면을 벗어나 사용자가 다시 돌아올 때 다시 녹화합니다. previewLayer를 다시 초기화하는 데 약 1 초의 지연이 발생하지만 작동하지만 괜찮습니다.

0

미리보기 레이어의 세션이 실행 중인지 확인하고, 그렇지 않은 경우 startRunning 세션 메서드를 호출 할 수 있습니다.

1

이 게시물 주셔서 감사합니다! 드디어 3 시간 동안 디버깅을 한 후 앱이 작동하게되었습니다. 여기에 제안 된 두 번째 접근 방식을 사용했으며 멋지게 작동했습니다.

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

관련 문제