【问题标题】:MPMoviePlayerController does not load first video in scrolling galleryMPMoviePlayerController 不会在滚动库中加载第一个视频
【发布时间】:2011-09-26 22:11:59
【问题描述】:

我正在使用 iOS SDK 4.3 进行开发。 我有一个水平滚动的分页画廊,可以显示来自远程提要的图像或视频。对于分页视图,我使用的是公开可用的 ATPagingView:页面的重用与 TableViewCells 类似。但是对于我使用单个 MPMoviePlayerController 的视频,我将其 .view 属性分配给多个页面作为子视图(我知道,我知道...):

moviePlayerController = [[MPMoviePlayerController alloc] init];
moviePlayerController.repeatMode = MPMovieRepeatModeNone;
moviePlayerController.controlStyle = MPMovieControlStyleEmbedded;
moviePlayerController.shouldAutoplay = false;
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(movieLoadStateChangeAction:) name:MPMoviePlayerLoadStateDidChangeNotification object:nil];

您可以看到我已经注册了 MoviePlayer 事件 LoadState 通知。 当新页面出现在屏幕上时,如果需要,我会开始加载视频:

- (void)currentPageDidChangeInPagingView:(ATPagingView *)pagingView
{
if (pagingView.currentPageIndex < 0)
    return;

NSLog(@"currentPageDidChangeInPagingView");
GalleryPageView *currentPage = (GalleryPageView *)[pagingView viewForPageAtIndex:pagingView.currentPageIndex];
if (![currentPage.gestureRecognizers count]) {
    UITapGestureRecognizer *recognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(resetZoom)];
    recognizer.numberOfTapsRequired = 2;
    [currentPage.zoomView addGestureRecognizer:recognizer];
    recognizer.delegate = self;
    [recognizer release];
}

moviePlayButton.hidden = YES;

[activityView stopAnimating];
FeedItem *feedItem = (FeedItem *)[dataRoot objectAtIndex:pagingView.currentPageIndex];
if (feedItem.contentType == FeedContentTypeMovie) {
    moviePlayerController.contentURL = [NSURL URLWithString:feedItem.movieUrl];
    [moviePlayerController prepareToPlay];
    [activityView startAnimating];
}

现在,如果 第一个 页面包含视频,即使在我调用 moviePlayerController.prepareToPlay 之后,它也不会加载:没有触发 loadState 事件。后续页面将按预期工作。 我尝试在 MPlayerController 初始化时预加载固定视频,但在这种情况下,固定视频已正确加载(MPMovieLoadState == 3),而第一页上的视频会导致 MPMovieLoadStateUnknown 发生变化。

电影网址正确。 当我从第 2 页滚动回第 1 页时,加载了第一个视频 (MPMovieLoadState == 3),但没有显示。

您建议调查什么?共享视图架构有那么可怕吗?毕竟,它适用于以下页面。 prepareToPlay 是否有任何已知的奇怪行为?例如,如果视图被任何人“虐待”,MPC 是否可能会生气,然后拒绝加载内容?你还会如何解释 MPMovieLoadStateUnknown?我很确定没有其他 MPC 鬼实例在乱七八糟(我已经读过它可能是个问题)。

谢谢你,很抱歉发了这么长的帖子。

【问题讨论】:

    标签: objective-c ios video


    【解决方案1】:

    我最终不得不使用 AVPlayer,因为在我的代码中与此非常相似。

    【讨论】:

    【解决方案2】:

    我遇到了同样的问题。在 iOS7 中不会发生这种情况,但在 iOS 6 中 loadState 为 3,这在以下情况下没有考虑:

    enum {
        MPMovieLoadStateUnknown        = 0,
        MPMovieLoadStatePlayable       = 1 << 0,
        MPMovieLoadStatePlaythroughOK  = 1 << 1, // Playback will be automatically started in this state when shouldAutoplay is YES
        MPMovieLoadStateStalled        = 1 << 2, // Playback will be automatically paused in this state, if started
    };
    typedef NSInteger MPMovieLoadState;
    

    我将自动播放设置为 NO 并使用 prepareToPlay 等待通知播放,所以当收到MPMoviePlayerLoadStateDidChangeNotification 时,在播放之前,我会像这样检查 loadState:

    if (self.moviePlayerC.loadState & MPMovieLoadStatePlayable || self.moviePlayerC.loadState & MPMovieLoadStatePlaythroughOK)
    

    也许在 iOS6 中 loadState 是一个 bitWise 值,可以同时包含多个状态。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-03
      • 1970-01-01
      • 1970-01-01
      • 2018-01-18
      • 2012-06-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多