ムービーを再生する

2011/09/05

ムービーを再生するには、MediaPlayer.framework をインポートし、MPMoviePlayerController を利用する事で、比較的簡単に実装する事ができます。 MediaPlayer

[iPhone] メディアプレイヤーで動画再生を参考に実装してみる。

サンプル

- (void)playMovie:(NSString *)movieName {
    NSString *path = [[NSBundle mainBundle] pathForResource:movieName ofType:@""];
    NSURL *url = [NSURL fileURLWithPath:path];
    MPMoviePlayerController *player = [[MPMoviePlayerController alloc] initWithContentURL:url];
    [player setShouldAutoplay:NO];
    
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(finishPreload:)
                                                 name:MPMediaPlaybackIsPreparedToPlayDidChangeNotification
                                               object:player];
    
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(finishPlayback:)
                                                 name:MPMoviePlayerPlaybackDidFinishNotification
                                               object:player];
    
    [player.view setFrame:CGRectMake(0, 0, 640.0f, 400.0f)];
    [self.view addSubview:player.view];
}

- (void)finishPreload:(NSNotification *)aNotification {
    MPMoviePlayerController *player = [aNotification object];
    [[NSNotificationCenter defaultCenter] removeObserver:self
                                                    name:MPMediaPlaybackIsPreparedToPlayDidChangeNotification
                                                  object:player];
}

- (void)finishPlayback:(NSNotification *)aNotification {
    MPMoviePlayerController *player = [aNotification object];
    [[NSNotificationCenter defaultCenter] removeObserver:self
                                                    name:MPMoviePlayerPlaybackDidFinishNotification
                                                  object:player];
    [player stop];
    [player.view removeFromSuperview];
    [player release];
}

NSNotificationCenter を利用して、プリロードや終了などを通知しています。 .h ファイルを見る限り delegate メソッドが記載されてないので、この方法なんでしょうね。

ただ、上記の場合は、自動連続再生とか複数に対応する場合のコードですかね? 普通に再生するだけなら Notification は使わなくてもいいんじゃないかな?と思います。

なので、手動でコントロールする場合は、MPMoviePlayerController を @synthesize してアクセスすればよいかと。 その際、メモリリークしないように release とかどこかしらでしないといけないと思いますが・・・。

手動で再生/停止

- (void)playMovie:(NSString *)movieName {
    NSString *path = [[NSBundle mainBundle] pathForResource:movieName ofType:@""];
    NSURL *url = [NSURL fileURLWithPath:path];
initWithContentURL:url];
    if (self.moviePlayer != nil) [moviePlayer release];
    self.moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:url];
    [self.moviePlayer setShouldAutoplay:NO];

    [self.moviePlayer.view setFrame:CGRectMake(0, 0, 640.0f, 400.0f)];
    [self.view addSubview:self.moviePlayer.view];
}