代码之家  ›  专栏  ›  技术社区  ›  marchinram

iPad上的MPMoviePlayerController播放错误

  •  1
  • marchinram  · 技术社区  · 15 年前

    我正在写一个应用程序,它将使用iPad上的MPMoviePlayerController来播放很多视频。问题是该应用程序工作正常,播放视频时,我停止工作约15小时前,但现在的视频不播放。MPMoviePlayerController将显示视频的第一帧,在全屏视图中,我可以很好地浏览电影,但当我点击play时,它会立即暂停。我有下面的代码,调试时我注意到,当我调用play时,它发送一个mpmovieplayerplaybackstatedidchange通知,playbackState为MPMoviePlaybackStatePlaying,然后它立即发送另一个mpmovieplayerplaybackstatedidchange通知,playbackState为mpmovieplaybackstateplaused。不知道这是否有帮助,但请让我知道如果你看到我的代码中有任何错误或有一个想法,谢谢。

    - (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];
            }
        }
    }
    
    1 回复  |  直到 15 年前
        1
  •  1
  •   marchinram    15 年前

    我想我明白了,我在每次调用前都会输入以下代码

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

    现在可以了,如果有人有任何意见请告诉我