Until iOS 8 we could use the trusty old MPMoviePLayerViewController class to play videos on our devices, but that’s been deprecated in iOS 9. From now on, Apple recommend we use the AVPlayerViewController class instead. It has many advantages and even supports picture-in-picture out of the box.
Although AVPlayerViewController is a subclass of UIViewController, instances of it cannot be presented using presentViewController – but Apple make sure not to mention this little tidbit. It’s much more “fun” to figure this out on our own.
Here’s how we can use it with a local video from the main bundle:
@import AVFoundation; @import AVKit; // ... // grab a local URL to our video NSURL *videoURL = [[NSBundle mainBundle]URLForResource:@"video" withExtension:@"mp4"]; // create an AVPlayer AVPlayer *player = [AVPlayer playerWithURL:videoURL]; // create a player view controller AVPlayerViewController *controller = [[AVPlayerViewController alloc]init]; controller.player = player; [player play]; // show the view controller [self addChildViewController:controller]; [self.view addSubview:controller.view]; controller.view.frame = self.view.frame;
First we grab a URL to either a local or remote video. Next we create an AVPlayer with this URL, and add said player to the newly created AVPlayerViewController instance. You can auto-play a video by using the player’s play method, or remove it and leave it up to the user to start the video.
Next we’ll present the controller by adding it as a subview to our current view, making sure it has the same frame size.
The class works equally well with local and remote URLs. To play a remote asset, construct the URL like this:
NSURL *videoURL = [NSURL URLWithString:@"https://github.com/versluis/Movie-Player/blob/master/Movie%20Player/video.mov?raw=true"];