プロじゃないのでコピペでコーディング!

四半世紀に迫ろうとするベテラン・コピペ・プログラマーが送るコピペの元。 張って動けば良し!動かなければなんで?そんな私をサポートするブログです。 ま、動けば良いと本人が思ってるなら、これでも良いんじゃね?って思ったら生暖かく見守って頂き、こりゃ目に余る!って思ったら、優しく教えてやってください。

Objective-C: 動画再生 AVPlayerViewController

概要

いろいろな動画フォーマットがあると思いますが、今回はiPhoneで撮影した動画を標準のライブラリで再生する方法です。

AVPlayerViewController

を使う方法を採り上げます。

なお、動画フォーマットなどと技術的にはさっぱり役に立たない用語で誤魔化しましたが、対象とする動画の仕様はAVPlayerViewControllerの仕様から逆引きして下さいませ。

キーワード: ファイルフォーマット、コーデック

詳細

再生するファイルが何処にあるか?というか話は今回の本題ではないので、今回はたまたま動画がアプリ内にあったとします。(たまたまですよ、たまたま)

コードはこんな感じ。

@import AVKit;
@import AVFoundation;


@interface AVPlayerViewController1 : AVPlayerViewController

@end

@implementation AVPlayerViewController1

- (void)viewDidLoad {
    [super viewDidLoad];
    
    // パス(Documents/movie00.m4v)の文字列を生成、URL化
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *path = [documentsDirectory stringByAppendingPathComponent:@"movie00.m4v"];
    NSURL *url = [NSURL fileURLWithPath:path];
    
    self.player = [AVPlayer playerWithURL:url];
    [self.player play];
    
    //再生が最後に到達したら通知を発生させ、通知を受け取ったらもう一度再生されるようにする
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(playerItemDidReachEnd:)
                                                 name:AVPlayerItemDidPlayToEndTimeNotification
                                               object:[self.player currentItem]];
    
}

- (void)playerItemDidReachEnd:(NSNotification *)notification {

    [self.player seekToTime:kCMTimeZero];
    [self.player play];
}

@end

今回は動画が繰り返し再生されるように、ローカル通知を使って「巻き戻し&再生」作業を行っています。

このコードを利用するには、以下のような流れになります。

  1. Objective-Cファイルを1つ新規追加して、上記コードをコピペする。

  2. StoryBoard上で、AVPlayerViewControllerを追加してSegueでViewの呼出設定をして、クラスファイルにAVPlayerViewController1を指定する。

f:id:kzthrk:20160403065657p:plain:w384

  1. どうにかしてDocumentsフォルダ内に動画をおいて、実行。

さいごに

その他にも様々なライブラリが世に出ていると思います。そのあたりは、また出会ったときに扱いたいと思います。

それから、再生する動画ファイルの場所は、そのアプリで撮影した場合、アプリ内でダウンロードした場合、そういったケースでは今回のコードのようにそのアプリ内にあるかと思います。これらは何れにしても、今回掲載のケースのバリエーションの一つだと思います。

そしてその他の場所としては、

といったケースが考えられます。それらについては、全く別のコンテキストでの利用が想定されますので、今回とは別の投稿で取り扱いたいと思います。