Добавление AVPlayerLayer в качестве подслоя текущего представления не работает на iPhone 5.

У меня есть экран входа в систему, для которого я хотел видеофон. Он воспроизводится, пока пользователь нажимает кнопки регистрации или входа. Стандартная вещь, которую вы видите в приложениях сегодня.

Вот что я делаю:

- (void)addPlayerLayer {

    NSString *moviePath = [[NSBundle mainBundle] pathForResource:@"login_signup_pink-girl" ofType:@"mp4"];
    NSURL *movieURL = [NSURL fileURLWithPath:moviePath];

    AVPlayer *player = [[AVPlayer alloc] initWithURL:movieURL];
    AVPlayerLayer *playerLayer = [AVPlayerLayer playerLayerWithPlayer:player];
    playerLayer.frame = CGRectMake(0,0,self.view.frame.size.width+self.screenShift, self.view.frame.size.height);
    playerLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;

    self.playerView = [[UIView alloc] initWithFrame:self.view.bounds];
    self.playerViewFrame = self.playerView.frame;
    [self.playerView.layer addSublayer:playerLayer];
    self.playerView.alpha = 0;
    [self.view insertSubview:self.playerView atIndex:0];
    [playerLayer.player play];

    [UIView animateWithDuration:0.4 delay:0 options:UIViewAnimationOptionCurveEaseInOut animations:^{
        self.playerView.alpha = 1.0;
    } completion:nil];

    [UIView animateWithDuration:0.6 delay:0 options:UIViewAnimationOptionCurveEaseInOut animations:^{

        self.loginButton.alpha = 1.0;
        self.createAccountButton.alpha = 1.0;
        self.skipStepButton.alpha = 1.0;
        self.mainSTbackgroundImageView.alpha = 0.0;

    } completion:nil];

}

Он отлично работает в симуляторе iOS на iPhone 5, но при тестировании на реальном устройстве видео никогда не загружается, у меня просто черный фон. Он также корректно работает на моем iPhone 6 (физическом, а не симуляторе).

Это любопытная проблема, которая заставляет меня спросить:

  • Почему видео не загружается на iPhone 5?
  • Должен ли я как-то предварительно загружать видео? (5,7 МБ .mp4)
  • Есть ли способ узнать, когда видео загружено и готово к показу? Иногда на симуляторе iPhone 5 есть небольшая задержка, из-за которой проявляется черный фон.

person Nic Hubbard    schedule 26.06.2015    source источник
comment
Вы когда-нибудь получали окончательный ответ на этот вопрос? Это происходит и со мной, и это довольно безумно. Если разберусь, то обязательно отвечу.   -  person Ben Kreeger    schedule 13.04.2016
comment
Да, я только что выложил код. Я следил за тем, что @TheM00s3 сказал о наблюдении за статусом игрока.   -  person Nic Hubbard    schedule 13.04.2016
comment
Ах, да — это касается пунктов 2 и 3, но я только что узнал кое-что о пункте 1. Вам когда-нибудь удавалось заставить его играть на iPhone 5?   -  person Ben Kreeger    schedule 13.04.2016
comment
@BenKreeger - Да, я смог заставить его играть на iPhone 5.   -  person Nic Hubbard    schedule 14.04.2016


Ответы (2)


Просто потому, что вы добавили слой игрока, он готов к игре. Вы хотите добавить наблюдателя к самому проигрывателю и наблюдать за его статусом, когда он изменится на ReadyToPlay. Что может случиться, так это то, что в симуляторе вы используете Wi-Fi, а по телефону используете свое соединение, которое может быть медленнее, чем при использовании Wi-Fi или даже стационарного телефона.

person TheM00s3    schedule 04.11.2015

Я последовал совету @TheM00s3 и сделал следующее:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object
                        change:(NSDictionary *)change context:(void *)context {
    if (object == self.player && [keyPath isEqualToString:@"status"]) {
        if (self.player.status == AVPlayerStatusReadyToPlay) {

            // Fade in top logo
            [UIView animateWithDuration:0.4 delay:0.2 options:UIViewAnimationOptionCurveEaseInOut animations:^{

                self.mainSTLogoTop.alpha = 1.0;

            } completion:nil];

            // Fade in video and out logo and text
            [UIView animateWithDuration:0.4 delay:0 options:UIViewAnimationOptionCurveEaseInOut animations:^{

                self.mainSTLogo.alpha = 0.0;
                self.animatedSequence.alpha = 0.0;

            } completion:^(BOOL finished) {

                // Add the video player
                [self.player play];

            }];

            [self.player removeObserver:self forKeyPath:@"status"];

        } else if (self.player.status == AVPlayerStatusFailed) {
            // something went wrong. player.error should contain some information
            NSLog(@"Error: %@", self.player.error);
            [self.player removeObserver:self forKeyPath:@"status"];
        }
    }
}
person Nic Hubbard    schedule 13.04.2016