Pregunta

Estoy escribiendo una aplicación que va a estar jugando un montón de vídeos utilizando el MPMoviePlayerController en el IPAD. El problema es la aplicación estaba funcionando bien y jugando los vídeos cuando dejó de funcionar hace aproximadamente 15 horas, pero ahora los vídeos no se reproducen. El MPMoviePlayerController mostrará el primer fotograma del vídeo, y en vista de pantalla completa que puede fregar a través de la fina película, pero cuando llegué a jugar sólo hace una pausa de inmediato. Tengo el código de abajo, al depurar me di cuenta de que cuando llamo jugar envía un MPMoviePlayerPlaybackStateDidChangeNotification con el playbackState siendo MPMoviePlaybackStatePlaying y luego de inmediato envía otra notificación MPMoviePlayerPlaybackStateDidChangeNotification con playbackState siendo MPMoviePlaybackStatePaused. No estoy seguro si eso ayuda, pero por favor, que me haga saber si usted ve mal algo en mi código o tener una idea, gracias.

- (void)handleNotification:(NSNotification *)notification {
    if ([[notification name] isEqualToString:MPMoviePlayerPlaybackStateDidChangeNotification]) {
        if (_videoPlayer.playbackState == MPMoviePlaybackStatePlaying) {
            _playButtonLarge.hidden = YES;
            _scrubber.maximumValue = _videoPlayer.duration;
            [_playPauseButton setBackgroundImage:[UIImage imageNamed:@"video_controls_pause.png"] forState:UIControlStateNormal];
            if (_updateScrubberTimer == nil) {
                _updateScrubberTimer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(updateScrubber) userInfo:nil repeats:YES];
            }
        } else if (_videoPlayer.playbackState == MPMoviePlaybackStatePaused || _videoPlayer.playbackState == MPMoviePlaybackStateStopped) {
            [_playPauseButton setBackgroundImage:[UIImage imageNamed:@"video_controls_play.png"] forState:UIControlStateNormal];
            _playButtonLarge.hidden = NO;
            if (_updateScrubberTimer != nil) {
                [_updateScrubberTimer invalidate];
                _updateScrubberTimer = nil;
            }
            if (_videoPlayer.playbackState == MPMoviePlaybackStateStopped) {
                _scrubber.value = 0.0f;
                _timePlayedLabel.text = @"0:00";
                _timeRemainingLabel.text = @"-0:00";
                _videoPlayerBG.hidden = NO;
            }
        }
    } else if ([[notification name] isEqualToString:MPMoviePlayerPlaybackDidFinishNotification]) {
        NSNumber *reason = [[notification userInfo] objectForKey:MPMoviePlayerPlaybackDidFinishReasonUserInfoKey];
        if ([reason intValue] == MPMovieFinishReasonPlaybackEnded) {
            _videoPlayerBG.hidden = NO;
        }
        _scrubber.value = _scrubber.maximumValue;
    }
}

- (void)playPause {
    if ([_videos count] > 0) {
        if (_videoPlayer.playbackState == MPMoviePlaybackStatePaused || _videoPlayer.playbackState == MPMoviePlaybackStateStopped) {
            _playButtonLarge.hidden = YES;
            _videoPlayerBG.hidden = YES;
            if ([_videoPlayer contentURL] == nil) {
                Video *video = [_videos objectAtIndex:0];
                [_videoPlayer setContentURL:video.videoURL];
            }
            if (![_videoPlayer isPreparedToPlay]) {
                [_videoPlayer prepareToPlay];
            }
            [_videoPlayer play];
        } else if (_videoPlayer.playbackState == MPMoviePlaybackStatePlaying) {
            _playButtonLarge.hidden = NO;
            [_videoPlayer pause];
        }
    }
}
¿Fue útil?

Solución

Creo que lo he descubierto, pongo el siguiente código antes de cada llamada a jugar

if (![_videoPlayer isPreparedToPlay]) { [_videoPlayer prepareToPlay]; }

funciona ahora, si alguien tiene alguna entrada que me haga saber

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top