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