MPMoviePlayerController зависает AVCaptureVideoPreviewLayer - PullRequest
0 голосов
/ 04 октября 2011

Я создаю приложение, которое показывает слой предварительного просмотра видео, используя 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.Я настроил его так (предыдущий блок кода взят из viewDidLoad: метод UIViewController, и это в том же контроллере, как часть его собственного метода для изменения представления:

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 добавляется в представление, предварительный просмотр «зависает» - он показывает последний кадр того, что было перед камерой перед входом в этот блок кода. Я не получаю сообщений об ошибках и не могу найти никакихисточник проблемы.

Я отмечаю, что я не освобождаю переменную player . Любые попытки сломать проигрыватель, включая автоматическое высвобождение, или попытку выпустить его вобратный вызов уведомлений. Однако я не думаю, что эта проблема (хотя потенциально и сама по себе) является причиной уничтожения моего слоя предварительного просмотра.

Буду признателен за любую информацию, которая у вас может возникнуть по этому вопросу!

Обновление : @boredastronaut спросил ниже, как я настраиваю представления здесь. У меня есть один контроллер, выполняющий все представленияs.В моем приложении у меня есть слой предварительного просмотра, и там же, вид, который содержит плеер.Все представления загружаются в -loadView:, и я использую свойство hidden , чтобы показать / скрыть эти слои соответствующим образом.

Ответы [ 3 ]

1 голос
/ 26 апреля 2013

Спасибо за этот пост!Я наконец заставил мое приложение работать после 3 часов отладки.Я использовал второй подход, предложенный здесь, и он работал прекрасно.

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

0 голосов
/ 15 мая 2012

Вы можете просто проверить, запущен ли сеанс слоя предварительного просмотра, а если нет, вызвать startRunning метод сеанса.

0 голосов
/ 15 октября 2011

После немалых усилий я остановился на другом решении.Я держал слой предварительного просмотра в памяти и работал, переключая представление на detailView.Теперь я снимаю previewLayer и полностью закрываю сеанс записи, когда он отключен от экрана, а затем снова собираю его, когда пользователь возвращается.Это вызывает задержку примерно в одну секунду для повторной инициализации PreviewLayer, но она работает, и я думаю, что это нормально.

...