我创建了一个播放实时视频的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?");
}
答案 0 :(得分:1)
我在movieFinishedCallback:
实施中看到,您删除了MPMoviePlayerController
视图,但在playUrl:
实施中,您只是设置了视图的框架,大概是在您之后已添加viewDidLoad
中的视图。
值得尝试的一个明显变化是更新代码以使用AVPictureInPictureController
框架中的AVPlayerViewController
或AVKit
类,或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]行
来解决此问题