MediaPlayerViewController サンプル

iOSで動画再生(MPMoviePlayerController)
MPMoviePlayerControllerを使うために、そのControllerを作成しなければなりません。
そのサンプルとして MediaPlayerViewController を作ります。

自分で作る際に、
・全画面で動画を再生したい
・画面をタップしたら再生終了
という2つの機能のみが欲しかったので、MPMoviePlayerController を選択しました。
動画編集等したい場合はAVPlayer を使うのが懸命かと思います。

ここで問題になったのが、画面をタップという操作でした。
MPMoviePlayerController のインスタンスがタップイベントをうまく受け取ってくれません。
そのため透明なUIVIewを配置しておき、そのViewでタッチイベントを受け取るという方法をとりました。

以前はこちらhttp://www.hirano-dept.com/blog/2010/04/iphone-mpmovieplayercontroller.htmlに書いてあったように、keyWindow を取ってこなければうまくいかなかったのですが、テストしてみたところ問題なく動いたので、通常の書き方に修正しました。


使い方
まずはMediaPlayer.Frameworkをプロジェクトに追加しておきます。
そして、次のファイルをプロジェクトに追加してください。

最後に playMovie メソッドを呼べば、動画再生が開始されます。

_videoPlayerのプロパティは初期でフルスクリーンになるように設定されています。
skipButtonEnabled はYESになっていますので必要のないときにはNOに設定してください。

git:https://github.com/ryufloat/CocoaExtention

何かあればコメントにどうぞ。



MediaPlayerViewController.h

#import <UIKit/UIKit.h>
#import <MediaPlayer/MediaPlayer.h>
@interface MediaPlayerViewController : UIViewController
{
    UIButton *skipButton;
}
@property (nonatomic) MPMoviePlayerController *videoPlayer;
@property (nonatomic, readonly) NSURL *url;
@property (nonatomic) BOOL skipButtonEnabled;
-(id)initWithURL:(NSURL*)url;
@end


MediaPlayerViewController.m

#import "MediaPlayerViewController.h"
@interfaceMediaPlayerViewController ()
@end
@implementation MediaPlayerViewController
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
        _videoPlayer = [[MPMoviePlayerControlleralloc] initWithContentURL:_url];
        _videoPlayer.controlStyle            = MPMovieControlStyleNone;
        _videoPlayer.scalingMode              = MPMovieScalingModeAspectFill;
        _videoPlayer.shouldAutoplay          = YES;
        _videoPlayer.view.autoresizingMask    = UIViewAutoresizingFlexibleWidth;
        _videoPlayer.view.autoresizesSubviews = YES;
        _videoPlayer.view.frame              = self.view.bounds;
        _skipButtonEnabled = YES;
    }
    return self;
}
-(id)initWithURL:(NSURL *)url
{
    if((self = [super init]))
    {       
        _url = url;
    }
    return self;
}
- (void)viewDidLoad
{
    [super viewDidLoad];
// Do any additional setup after loading the view.
}
- (void)playMovie {
    self.title = @"MPMoviePlayerController";
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(finishPreload:)
                                                 name:MPMediaPlaybackIsPreparedToPlayDidChangeNotification
                                               object:_videoPlayer];
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(finishPlayback:)
                                                 name:MPMoviePlayerPlaybackDidFinishNotification
                                               object:_videoPlayer];
    // viewに追加
    [self.videoPlayer prepareToPlay];
    [self.view addSubview:_videoPlayer.view];
}
- (void)finishPreload:(NSNotification *)aNotification {
    MPMoviePlayerController *player = [aNotification object];
    [[NSNotificationCenter defaultCenter] removeObserver:self
                                                    name:MPMediaPlaybackIsPreparedToPlayDidChangeNotification
                                                  object:player];
    [player play];
    //SkipView にはタッチイベントを取得して、ムービー停止を呼ぶメソッドがある
    if (_skipButtonEnabled)
    {
        skipButton = [[UIButtonalloc]initWithFrame:[UIScreenmainScreen].bounds];
        [skipButton addTarget:selfaction:@selector(skipButtonTouched:) forControlEvents:UIControlEventTouchUpInside];
        [self.view addSubview:skipButton];
    }
}
- (void)finishPlayback:(NSNotification *)aNotification {
    MPMoviePlayerController *player = [aNotification object];
    [[NSNotificationCenter defaultCenter] removeObserver:self
                                                    name:MPMoviePlayerPlaybackDidFinishNotification
                                                  object:player];
    [player stop];
    if(_skipButtonEnabled)
    {
        [self removeSkipButton];
    }
}
-(void)skipButtonTouched:(UITapGestureRecognizer*)tapRecognizer
{
    [[NSNotificationCenter defaultCenter] removeObserver:self
                                                    name:MPMoviePlayerPlaybackDidFinishNotification
                                                  object:_videoPlayer];
    [_videoPlayer stop];
    if(_skipButtonEnabled)
    {
        [self removeSkipButton];
    }
}

-(void)removeSkipButton
{
    [skipButton removeFromSuperview];
    skipButton = nil;
}
- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}
@end