MPMoviePlayerViewController在第二次运行时无法播放

时间:2016-07-14 03:31:27

标签: objective-c mpmovieplayercontroller

我创建了一个播放实时视频的MPMoviePlayerViewController。但是,如果我播放视频两次意味着打开播放器,请单击“完成”,然后再次播放该流。结果只是一个黑屏,没有MPMoviePlayerViewController的控件。我需要停止模拟器,因为我认为应用程序崩溃了。这就是我的做法

- (void) playUrl:(NSURL *)movieInfo
{
    NSURL *streamUrl   = movieInfo;
    MPMoviePlayerViewController *mpvc = [[MPMoviePlayerViewController alloc] initWithContentURL:streamUrl];
    [[mpvc view] setFrame:self.view.bounds];
    [[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(movieFinishedCallback:)
                                             name:MPMoviePlayerPlaybackDidFinishNotification
                                           object:nil];

    mpvc.moviePlayer.movieSourceType = MPMovieSourceTypeStreaming;
    [mpvc.moviePlayer setControlStyle:MPMovieControlStyleFullscreen];
    [mpvc.moviePlayer setShouldAutoplay:YES];
    [mpvc.moviePlayer setFullscreen:NO animated:YES];
    [mpvc setModalTransitionStyle:UIModalTransitionStyleCoverVertical];
    [mpvc.moviePlayer setScalingMode:MPMovieScalingModeNone];
    [mpvc.moviePlayer setUseApplicationAudioSession:NO];
    [self presentMoviePlayerViewControllerAnimated:mpvc];

}


- (void) movieFinishedCallback:(NSNotification*) aNotification 
{
    MPMoviePlayerController *player = [aNotification object];

    [player stop];

    [[NSNotificationCenter defaultCenter] removeObserver:self
                                                    name:MPMoviePlayerPlaybackDidFinishNotification
                                                  object:player];
    [player.view removeFromSuperview];

    NSLog(@"stopped?");
}

2 个答案:

答案 0 :(得分:1)

我在movieFinishedCallback:实施中看到,您删除了MPMoviePlayerController视图,但在playUrl:实施中,您只是设置了视图的框架,大概是在您之后已添加viewDidLoad中的视图。

值得尝试的一个明显变化是更新代码以使用AVPictureInPictureController框架中的AVPlayerViewControllerAVKit类,或WKWebView类中的WebKit类1}}。根据{{​​1}} docs,从iOS 9开始不推荐使用它:

  

MPMoviePlayerViewController类在iOS 9中正式弃用。(MPMoviePlayerController类也正式弃用。)要在iOS 9及更高版本中播放视频内容,请使用AVKit框架中的AVPictureInPictureController或AVPlayerViewController类,或者使用来自的WKWebView类。 WebKit的。

尝试将添加视图的行移动到层次结构中,移动到MPMoviePlayerViewController方法。通常,优良作法是在事件对应方的反对方法中使用反向实现。例如,实现一个方法来在事件开始时构建和添加视图,并且具有相应的方法,在同一事件结束时拆除并删除相同的视图。但是,我说'一般'因为总有例外,你可能有非常令人信服的理由不这样做。因此,在这种情况下,相反的来电是playUrl:presentMoviePlayerViewControllerAnimated:,可从dismissMoviePlayerViewControllerAnimated:类别中获取。

更改UIViewController使用点符号的访问权限后,为了与您的回调实现保持一致,假设您正在添加视图,这就是您的新view实现的样子到playUrl:

self.view

另一种选择是在回调方法中不删除播放器的视图。如果那不是罪魁祸首,那么接下来我要调查的是检查你是否向- (void) playUrl:(NSURL *)movieInfo { NSURL *streamUrl = movieInfo; MPMoviePlayerViewController *mpvc = [[MPMoviePlayerViewController alloc] initWithContentURL:streamUrl]; [mpvc.view setFrame:self.view.bounds]; [self.view addSubview:mpvc.view]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(movieFinishedCallback:) name:MPMoviePlayerPlaybackDidFinishNotification object:nil]; mpvc.moviePlayer.movieSourceType = MPMovieSourceTypeStreaming; [mpvc.moviePlayer setControlStyle:MPMovieControlStyleFullscreen]; [mpvc.moviePlayer setShouldAutoplay:YES]; [mpvc.moviePlayer setFullscreen:NO animated:YES]; [mpvc setModalTransitionStyle:UIModalTransitionStyleCoverVertical]; [mpvc.moviePlayer setScalingMode:MPMovieScalingModeNone]; [mpvc.moviePlayer setUseApplicationAudioSession:NO]; [self presentMoviePlayerViewControllerAnimated:mpvc]; } 个对象发送消息。另外,看看当你从nil取出所有实现时会发生什么,除了获取和停止播放器。

我希望有所帮助!

答案 1 :(得分:0)

通过删除[player.view removeFromSuperview]行

来解决此问题