I've created a blank project (iOS) and put this in my viewDidLoad:
NSString *moviePath = [[NSBundle mainBundle] pathForResource:@"Movie" ofType:@"m4v"];
MPMoviePlayerViewController *playerController = [[MPMoviePlayerViewController alloc] initWithContentURL:[NSURL fileURLWithPath:moviePath]];
[self presentMoviePlayerViewControllerAnimated:playerController];
[playerController.moviePlayer play];
When the app starts all I get is a white screen with error messages in the log:
<Error>: CGContextSaveGState: invalid context 0x0
<Error>: CGContextClipToRect: invalid context 0x0
<Error>: CGContextTranslateCTM: invalid context 0x0
<Error>: CGContextDrawShading: invalid context 0x0
<Error>: CGContextRestoreGState: invalid context 0x0
Warning: Attempt to present <MPMoviePlayerViewController: 0x821e3b0> on <ViewController: 0x863aa40> whose view is not in the window hierarchy!
...and a bunch of lines regarding disabling autoplay. I especially don't understand the line about the view not being part of the hierarchy since it's a blank "Single View Application" iOS project and the code is in ViewController.m. It IS in the view hierarchy.
I know for a fact that the movie file itself is not the problem because I got it from Apple's sample code on MPMoviePlayer. And although I (seemingly) tried everything written in the sample, I just couldn't get the player to work.
Here is another try, this time with MPMoviePlayerController (not MPMoviePlayerViewController):
MPMoviePlayerController *player = [[MPMoviePlayerController alloc] initWithContentURL:url];
[player setContentURL:url];
[player setMovieSourceType:MPMovieSourceTypeFile];
[[player view] setFrame:self.view.bounds];
[player view].backgroundColor = [UIColor greenColor];
player.scalingMode = MPMovieScalingModeNone;
player.controlStyle = MPMovieControlModeDefault;
player.backgroundView.backgroundColor = [UIColor whiteColor];
player.repeatMode = MPMovieRepeatModeNone;
[self.view addSubview: [player view]];
[player play];
Similar result, with white screen and errors. Please help....
Try add
after
You can read more about MPMoviePlayerController in Apple documentation: http://developer.apple.com/library/ios/#documentation/mediaplayer/reference/MPMoviePlayerController_Class/Reference/Reference.html#//apple_ref/doc/c_ref/MPMoviePlayerController
Try this:
You have to try this......
Turns out all we have to do is this:
movieController
is an instance ofMPMoviePlayerViewController
declared in the .h file.Important: when defining the URL use NSURL's
URLWithString
method if you want to access the file through a network and use NSURL'sfileUrlWithPath
if you have the file locally![movieController.moviePlayer play]
is not required and the player will start regardless if you didn't set autoplay to NO, but I observed that if you putplay
in it it starts a bit quicker. This could be just a coincidence.If you want to know when the user tapped the done button (the player will be dismissed automatically) you should know that
-viewDidAppear
is called on the view controller that appears when the player is dismissed. You could set aBOOL
variable when the player starts and check for theBOOL
in your-viewDidAppear
so that you know that-viewDidAppear
was called becaouse the player was dismissed. Alternatively you can register forMPMoviePlayerDidExitFullScreen
notification, but that didn't work for me.OR, if this is not working you can just do the following
self.movieplayer is an instance of MPMoviePlayerController (not MPMoviePlayerViewController). In my experience it's important to declare it as a property (like so:
@property (strong, nonatomic) MPMoviePlayerController *moviePlayer;
) rather than a simple ivar, because sometimes it just doesn't work if it's an ivarsetting the frame is also important, because if we don't set it, the video will not appear at all. The frame can be anything as long as what you define is within the bounds of your view
Important: As above, when defining the URL use NSURL's
URLWithString
method if you want to access the file through a network and use NSURL'sfileUrlWithPath
if you have the file locally!