按顺序播放两部不同电影时叠加查看问题

时间:2009-12-24 00:51:57

标签: iphone video

我正在尝试使用MPMoviePlayerController类播放两个视频,并允许用户通过在屏幕上滑动手指来切换两个视频。一切都适合第一部电影。叠加视图正确检测到滑动并开始播放下一部电影。

不幸的是,第二部电影的效果并不好。我不确定发生了什么,但叠加视图实际上似乎并不在电影播放器​​之上,并且肯定没有响应触摸事件。实际上,在播放第二部电影时双击屏幕可以放大和缩小电影,所以触摸似乎是要转到MPMoviePlayerController。

我在这里尝试了许多不同的方法,但它们都不起作用。以下是代码的当前版本:

- (void)allocateMoviePlayerForCurrentVideo
{
    // Create a movie player for the first video in the playlist
    NSURL *url = [videoURLs objectAtIndex:nowPlayingVideoIndex];
    moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:url];
    moviePlayer.scalingMode = MPMovieScalingModeAspectFill;
    moviePlayer.movieControlMode = MPMovieControlModeHidden;
    moviePlayer.backgroundColor = [UIColor blackColor];

    // Register for the movie preload complete notification
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(moviePreloadComplete:)
                                                 name:MPMoviePlayerContentPreloadDidFinishNotification
                                               object:nil];

    // Register for the playback did finish notification
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(movieDidFinishPlaying:)
                                             name:MPMoviePlayerPlaybackDidFinishNotification
                                             object:nil];
}

处理MPMoviePlayerContentPreloadDidFinishNotification的代码启动电影播放并添加叠加视图:

- (void)moviePreloadComplete:(NSNotification *)notification
{
    // Remove this object from observing the preload complete notification
    [[NSNotificationCenter defaultCenter] removeObserver:self
                                                    name:MPMoviePlayerContentPreloadDidFinishNotification
                                                  object:nil];
    // Start playing the current movie
    [moviePlayer play];

    // Add the overlay view to the movie player
    UIWindow *moviePlayerWindow= [[[UIApplication sharedApplication] windows] objectAtIndex:1];
    overlayView = [[GGDMovieOverlayView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];
    overlayView.backgroundColor = [UIColor clearColor];
    [moviePlayerWindow addSubview:overlayView];
    [moviePlayerWindow bringSubviewToFront:overlayView];

    // Register for swipe notifications from the overlay view
    [[NSNotificationCenter defaultCenter] addObserver:self
                                            selector:@selector(handleMoviePlayerSwipeNotification:)
                                                 name:GGDMoviePlayerSwipeNotification
                                               object:nil];
}

最后,这是处理滑动通知的例程:

- (void)handleMoviePlayerSwipeNotification:(NSNotification *)notification
{
    // Stop the current movie player and release it
    [moviePlayer stop];
    [moviePlayer release];
    moviePlayer = nil;

    // Remove the overlay view from its superview
    [overlayView removeFromSuperview];

    // Advance to the next movie, treating the array of video URLs as a circular array
    if ( ++nowPlayingVideoIndex == [videoURLs count] ) {
        nowPlayingVideoIndex = 0;
    }
    [self allocateMoviePlayerForCurrentVideo];
}

我担心有一些明显的东西我不知道了,但这已经让我疯了一段时间了。我非常感谢任何帮助!

谢谢,
亚当

2 个答案:

答案 0 :(得分:0)

通过使用NSTimer在延迟后添加叠加视图以确保电影已开始播放来修复。

谢谢,
亚当

答案 1 :(得分:0)

我亲自经历了这个问题,我可以解释这个问题,并提供一个稍好的解决方法。

按顺序运行下一部电影的问题是,在电影完成播放后获得的通知发生在从视图中删除当前电影播放器​​窗口之前。这是一个问题,因为(根据Apple示例)获取电影播放器​​窗口的唯一方法是抓住堆栈(或关键窗口)上的顶部窗口。但是如果你试着立即使用这种技术,你将会得到一个渐渐消失的旧电影播放器​​窗口,而不是新的电影播放器​​窗口。 (顺便说一句 - 坦率地说,苹果的例子是一个例子,根本没有正确的方法来获取电影窗口......他们的例子很糟糕,可能是一个竞争条件开始,除非某种方式播放方法阻止直到窗口实际上在堆栈上。)

无论如何,我所做的不是任意延迟,而是在首次创建时标记播放器窗口,例如。

UIWindow * moviePlayerWindow = [[UIApplication sharedApplication] keyWindow];  moviePlayerWindow.tag = MY_MOVIE_WINDOW_TAG; //这只是一个int

然后在moviePlaybackDidFinish方法中调用waitForMovieWindowToExit方法来查找该标记窗口。如果它仍然存在,那么我使用计时器在0.1秒内再次检查。当它最终消失时,我播放下一个序列。

所以,它仍然是一个烂摊子,仍然使用计时器,但至少你保证在下一个可能的时间0.1秒(或其他)内播放下一部电影,如果系统有点不会打破它慢等等。

如果有人想要更多代码我可以发布。