2

MPMoviePlayerViewController を次のように作成しています。

MPMoviePlayerViewController *playerView = [[MPMoviePlayerViewController alloc] initWithContentURL:videoURL];
[self presentMoviePlayerViewControllerAnimated:playerView];

ホームボタンを押すまでは正常に動作します。そのようにして、アプリを再度開いた後、プレーヤーのビューコントローラーがなくなり、最初に呼び出したビューコントローラーが表示されます。ホームボタンを2回押してマルチタスクパネルを開くと、プレーヤーは消えませんが、一時停止します(当然のことです)。

では、これを防ぐにはどうすればよいでしょうか (アプリを閉じて再度開くと、ビデオの再生に戻るはずです)。

UPD: 「読み込み中…」というテキストが表示されている間にアプリを閉じて再度開いても、プレーヤーが消えないことに気付きました。その場合、アプリに戻ると、プレーヤーはビデオの読み込みを続行して、最終的に再生を開始できます。ただし、その後 (ビデオの再生中または一時停止中に) アプリを閉じると、必然的にプレーヤー ビュー コントローラーが強制終了されます…</p>

4

4 に答える 4

1

ここで答えを見つけました:

アプリがアクティブ状態を辞退すると、MPMoviePlayerViewController が閉じられる

plist の必須値

ただし、その質問(および回答)の作成者は、彼のアプリがこれで拒否されたと述べています。

于 2012-09-12T04:40:31.783 に答える
1

このようにしてみてください:

 MPMoviePlayerViewController *playerView = [[MPMoviePlayerViewController alloc] initWithContentURL:videoURL];
    playerView.view.frame = self.view.frame;
    [self presentMoviePlayerViewControllerAnimated:playerView];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(MPMoviePlayerDidExitFullscreen:) name:MPMoviePlayerDidExitFullscreenNotification object:nil];
    [[NSNotificationCenter defaultCenter]
     addObserver:self
     selector:@selector(playbackStateChanged:)
     name:MPMoviePlayerPlaybackStateDidChangeNotification
     object:moviePlayerController];

     [playerView.moviePlayer play];

その後、次の 2 つのメソッドを追加します。

- (void) movieFinishedCallback:(NSNotification*) aNotification 
{
    moviePlayerController = [aNotification object];
    [moviePlayerController.moviePlayer stop];
    [[NSNotificationCenter defaultCenter] 
     removeObserver:self name:MPMoviePlayerPlaybackDidFinishNotification
     object:moviePlayerController];
    [moviePlayerController autorelease];
    NSLog(@"stopped?");
}

- (void)MPMoviePlayerDidExitFullscreen:(NSNotification *)notification
{
    [[NSNotificationCenter defaultCenter] removeObserver:self
                                                    name:MPMoviePlayerDidExitFullscreenNotification 
                                                  object:nil];

    [moviePlayerController.moviePlayer stop];
    MPMoviePlayerController *player = [notification object];
    [[NSNotificationCenter defaultCenter] 
     removeObserver:self name:MPMoviePlayerPlaybackDidFinishNotification
     object:player];
    [moviePlayerController dismissMoviePlayerViewControllerAnimated];
}
于 2012-09-12T03:49:40.043 に答える
0

you try this code---

 - (void)willEnterFullscreen:(NSNotification*)notification {
NSLog(@"willEnterFullscreen");
}

- (void)enteredFullscreen:(NSNotification*)notification {
NSLog(@"enteredFullscreen");
}

- (void)willExitFullscreen:(NSNotification*)notification {
NSLog(@"willExitFullscreen");
}

- (void)exitedFullscreen:(NSNotification*)notification {
NSLog(@"exitedFullscreen");
[self.movieController.view removeFromSuperview];
self.movieController = nil;
[[NSNotificationCenter defaultCenter] removeObserver:self];
}

- (void)playbackFinished:(NSNotification*)notification {
NSNumber* reason = [[notification userInfo] objectForKey:MPMoviePlayerPlaybackDidFinishReasonUserInfoKey];
switch ([reason intValue]) {
    case MPMovieFinishReasonPlaybackEnded:
        NSLog(@"playbackFinished. Reason: Playback Ended");         
            break;
    case MPMovieFinishReasonPlaybackError:
        NSLog(@"playbackFinished. Reason: Playback Error");
            break;
    case MPMovieFinishReasonUserExited:
        NSLog(@"playbackFinished. Reason: User Exited");
            break;
    default:
        break;
}
[self.movieController setFullscreen:NO animated:YES];
}

- (void)showMovie {
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(willEnterFullscreen:) name:MPMoviePlayerWillEnterFullscreenNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(willExitFullscreen:) name:MPMoviePlayerWillExitFullscreenNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(enteredFullscreen:) name:MPMoviePlayerDidEnterFullscreenNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(exitedFullscreen:) name:MPMoviePlayerDidExitFullscreenNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playbackFinished:) name:MPMoviePlayerPlaybackDidFinishNotification object:nil];

NSURL* movieURL =  [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"tron" ofType:@"mov"]];
self.movieController = [[MPMoviePlayerController alloc] initWithContentURL:movieURL];
self.movieController.view.frame = self.view.frame;
[self.view addSubview:movieController.view];
[self.movieController setFullscreen:YES animated:YES];
[self.movieController play];
}
于 2012-09-12T05:43:54.447 に答える
0

MPMoviePlayerViewControllers は、アーノルドが述べたように、アプリがバックグラウンドに移行すると閉じます。また、埋め込まれているビュー コントローラー ビューを離れたときにも閉じることができます。両方の問題を解決するには、MPMoviePlayerViewController を ivar またはプロパティとして保持し、 vc の viewWillAppear: が呼び出されるか、次のようにアプリケーションが再びフォアグラウンドに入ったとき:

- (void) viewDidLoad{
      [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reset) name:UIApplicationWillEnterForegroundNotification object:nil];
}    

- (void) viewWillAppear:(BOOL)animated{
      [self reset];
}

- (void) reset{
      [_mpmpvc.moviePlayer prepareToPlay];
      [_mpmpvc.moviePlayer pause];
}
于 2014-01-04T05:16:55.457 に答える