2016-07-14 62 views
3

我創建了一個播放實時視頻的MPMoviePlayerViewController。但是,如果我播放視頻兩次,即打開播放器,單擊完成並再次播放流。結果只是一個沒有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?"); 
} 

回答

1

我看到在你的movieFinishedCallback:的實施,爲您免除MPMoviePlayerController視圖,但在你的playUrl:實現,你只設置視圖的框架後,想必你已經添加視圖viewDidLoad

一個明顯的變化,這是值得嘗試的,是更新你的代碼使用AVPictureInPictureControllerAVPlayerViewController類從AVKit框架,或從WebKitWKWebView類。按照MPMoviePlayerViewControllerdocs,它被棄用的iOS 9:

的MPMoviePlayerViewController類在iOS版正式9.不推薦使用(該的MPMoviePlayerController類也正式棄用)要在iOS版9和後播放視頻內容,而應使用AVKit框架中的AVPictureInPictureController或AVPlayerViewController類或WebKit中的WKWebView類。

嘗試移動將視圖添加到層​​次結構的行,移動到playUrl:方法。一般來說,對於事件對手來說,反對方法是最好的做法。例如,實現在事件啓動時構建和添加視圖的方法,並且具有相應的方法,在相同的事件結束時拆除和刪除相同的視圖。但是,我說'一般'是因爲總是有例外,你可能有非常令人信服的理由不這樣做。因此,在這種情況下,對方的電話是presentMoviePlayerViewControllerAnimated:dismissMoviePlayerViewControllerAnimated:,可從UIViewController類別獲得。

改變view訪問使用點符號,可與您的回調實現一致後,這裏是你的新playUrl: implemntation會是什麼樣子,假設你要添加視圖以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對象。另外,看看當你從movieFinishedCallback:中取出所有實現時會發生什麼,除了獲取和停止播放器。

我希望有幫助!

+0

嘗試解除當前未顯示視圖的模式視圖控制器,從而解決了該問題。 self = modalViewController = 我收到此消息 – drbj

+0

嗨,我還看到你有一個'presentMoviePlayerViewControllerAnimated'調用。這是否使用'UIViewController'' presentMoviePlayerViewControllerAnimated'方法?如果是這樣,你應該使用'dismissXXX'對應的刪除它。 – Sheamus

+0

由於'MPMoviePlayerViewController'已被棄用,我還更新了我的答案,並提出了更新到'AVPictureInPictureController'或'AVPlayerViewController'的建議。 – Sheamus

0

通過刪除[player.view removeFromSuperview]行

+0

恭喜!我很高興它的工作。請檢查我的答案! – Sheamus

相關問題