【问题标题】:Cannot pause looping movie because of bugs in MPMoviePlayerController由于 MPMoviePlayerController 中的错误,无法暂停循环播放的电影
【发布时间】:2013-10-29 19:04:36
【问题描述】:

我是这样设置电影播放器​​的:

self.moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:@"whatever.mp4"];
    self.moviePlayer.controlStyle = MPMovieControlStyleNone;
    self.moviePlayer.shouldAutoplay = YES;
    [self.moviePlayer prepareToPlay];
    self.moviePlayer.repeatMode = MPMovieRepeatModeOne;
    self.moviePlayer.view.frame = self.container.bounds;
    self.moviePlayer.view.userInteractionEnabled = NO;
    [self.container addSubview:self.moviePlayer.view];

    [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(moviePlayBackDidFinish:) name: MPMoviePlayerPlaybackStateDidChangeNotification
                                               object: self.moviePlayer];

通知对于保持播放器循环播放是必要的,因为 repeatMode 几乎没用(视频会重复一到两次,可能会重复几次,具体取决于中国的大米价格,然后停止)。因此,要保持视频循环播放,您必须这样做:

- (void)moviePlayBackDidFinish:(NSNotification *)note {
    if (note.object == self.moviePlayer) {
        NSInteger reason = [[note.userInfo objectForKey:MPMoviePlayerPlaybackDidFinishReasonUserInfoKey] integerValue];
        if (reason == MPMovieFinishReasonPlaybackEnded) {
            [self.moviePlayer play];
        }
    }
}

现在的问题是我需要能够暂停视频。出于某种原因,调用

    [self.moviePlayer pause];

导致通知被触发原因 == MPMovieFinishReasonPlaybackEnded,即使文档清楚地说明了这一点:

Constants
MPMovieFinishReasonPlaybackEnded
The end of the movie was reached.
Available in iOS 3.2 and later.
Declared in MPMoviePlayerController.h.

影片未到结尾。我只是叫暂停:。因此通知被触发,因此电影再次播放,取消暂停操作。

所以你可以看到问题。如何成功暂停循环播放的视频?

【问题讨论】:

  • 为什么不跟踪通知是由暂停按钮触发还是使用 BOOL 变量结束的循环?
  • 怎么样?就像我说的那样,视频是否结束或暂停被称为原因返回为 MPMovieFinishReasonPlaybackEnded。

标签: ios mpmovieplayercontroller nsnotifications


【解决方案1】:

在你的类中创建一个 BOOL 并将其初始化为 NO,

@property (nonatomic, assign) BOOL isTriggeredByPause;

打电话之前

[self.moviePlayer pause];

设置它的值,

self.isTriggeredByPause = YES;

在你的方法中检查它,

 (void)moviePlayBackDidFinish:(NSNotification *)note {
if (note.object == self.moviePlayer) {
    NSInteger reason = [[note.userInfo objectForKey:MPMoviePlayerPlaybackDidFinishReasonUserInfoKey] integerValue];
    if (reason == MPMovieFinishReasonPlaybackEnded) {
if(!self.isTriggeredByPause)
{
    [self.moviePlayer play];
}
}
}
}

手动播放时也要修改self.isTriggeredByPause的值,否则循环不起作用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多