Re: MPMoviePlayerController setContentURL twice
Re: MPMoviePlayerController setContentURL twice
- Subject: Re: MPMoviePlayerController setContentURL twice
- From: Heath Borders <email@hidden>
- Date: Mon, 21 Mar 2011 22:59:04 -0500
That's exactly what I did. I have a brand new project with just a
ViewController with 3 views: 1 to hold the MPMoviePlayerController's
view, 1 button for my first movie, and 1 button for my second movie.
When the buttons are clicked, I create NSURLs from the appropriate
files. I've included my controller. I just set it as the window's
rootViewController in my appDelegate. Any comments you have are
greatly appreciated!
#import <MediaPlayer/MediaPlayer.h>
#import <AVFoundation/AVFoundation.h>
#import <CoreMedia/CoreMedia.h>
#import <UIKit/UIKit.h>
@interface MoviePlayerViewController : UIViewController {
}
@end
@interface MoviePlayerViewController()
@property (nonatomic, retain) UIView *moviePlayerHolderView;
@property (nonatomic, retain) MPMoviePlayerController *moviePlayerController;
- (void)loadBigVideoFromFile;
- (void)loadBigAudioFromFile;
- (void)loadAssetFromFileUrl: (NSURL *) fileUrl;
- (void)moviePlayerLoadStateDidChange;
- (void)moviePlayerPlaybackStateDidChange;
@end
@implementation MoviePlayerViewController
@synthesize moviePlayerHolderView = _moviePlayerHolderView;
@synthesize moviePlayerController = _moviePlayerController;
#pragma mark -
#pragma mark init/dealloc methods
- (id)init {
self = [super initWithNibName:nil bundle:nil];
if (self) {
}
return self;
}
- (void)dealloc {
self.moviePlayerHolderView = nil;
self.moviePlayerController = nil;
[[NSNotificationCenter defaultCenter] removeObserver:self];
[super dealloc];
}
#pragma mark -
#pragma mark UIViewController
- (void)loadView {
[super loadView];
self.moviePlayerHolderView = [[[UIView alloc]
initWithFrame:CGRectMake(CGRectGetMinX(self.view.bounds),
CGRectGetMinY(self.view.bounds),
CGRectGetWidth(self.view.bounds),
CGRectGetHeight(self.view.bounds) - 50)] autorelease];
self.moviePlayerHolderView.autoresizingMask =
UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
[self.view addSubview:self.moviePlayerHolderView];
self.moviePlayerController = [[[MPMoviePlayerController alloc] init]
autorelease];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(moviePlayerLoadStateDidChange)
name:@"MPMoviePlayerLoadStateDidChangeNotification"
object:self.moviePlayerController];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(moviePlayerPlaybackStateDidChange)
name:@"MPMoviePlayerPlaybackStateDidChangeNotification"
object:self.moviePlayerController];
self.moviePlayerController.controlStyle = MPMovieControlStyleEmbedded;
self.moviePlayerController.movieSourceType = MPMovieSourceTypeFile;
self.moviePlayerController.shouldAutoplay = NO;
self.moviePlayerController.view.autoresizingMask =
UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
self.moviePlayerController.view.frame = self.moviePlayerHolderView.bounds;
[self.moviePlayerHolderView addSubview:self.moviePlayerController.view];
UIButton *loadAudioButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
loadAudioButton.autoresizingMask =
UIViewAutoresizingFlexibleRightMargin |
UIViewAutoresizingFlexibleTopMargin;
loadAudioButton.frame = CGRectMake(CGRectGetMinX(self.view.bounds),
CGRectGetMaxY(self.moviePlayerHolderView.frame),
CGRectGetWidth(self.view.bounds) / 2,
50);
[loadAudioButton addTarget:self
action:@selector(loadBigAudioFromFile)
forControlEvents:UIControlEventTouchUpInside];
[loadAudioButton setTitle:@"Load Audio"
forState:UIControlStateNormal];
[self.view addSubview:loadAudioButton];
UIButton *loadVideoButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
loadVideoButton.autoresizingMask =
UIViewAutoresizingFlexibleLeftMargin |
UIViewAutoresizingFlexibleRightMargin |
UIViewAutoresizingFlexibleTopMargin;
loadVideoButton.frame = CGRectMake(CGRectGetMaxX(loadAudioButton.frame),
CGRectGetMaxY(self.moviePlayerHolderView.frame),
CGRectGetWidth(self.view.bounds) / 2,
50);
[loadVideoButton addTarget:self
action:@selector(loadBigVideoFromFile)
forControlEvents:UIControlEventTouchUpInside];
[loadVideoButton setTitle:@"Load Video"
forState:UIControlStateNormal];
[self.view addSubview:loadVideoButton];
}
- (void)viewDidUnload {
self.moviePlayerHolderView = nil;
self.moviePlayerController = nil;
[[NSNotificationCenter defaultCenter] removeObserver:self];
[super viewDidUnload];
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return YES;
}
#pragma mark -
#pragma mark private API
- (void)loadBigAudioFromFile {
NSURL *fileUrl = [[NSBundle mainBundle] URLForResource:@"heath"
withExtension:@"mov"];
[self loadAssetFromFileUrl:fileUrl];
}
- (void)loadBigVideoFromFile {
NSURL *fileUrl = [[NSBundle mainBundle] URLForResource:@"heath2"
withExtension:@"mov"];
[self loadAssetFromFileUrl:fileUrl];
}
- (void)loadAssetFromFileUrl: (NSURL *) fileUrl {
[self.moviePlayerController stop];
self.moviePlayerController.contentURL = fileUrl;
NSLog(@"after setContentURL to %@: %@", fileUrl,
self.moviePlayerController.contentURL);
}
- (void)moviePlayerPlaybackStateDidChange {
switch (self.moviePlayerController.playbackState) {
case MPMoviePlaybackStateStopped:
NSLog(@"stopped");
break;
case MPMoviePlaybackStatePlaying:
NSLog(@"playing");
break;
case MPMoviePlaybackStatePaused:
NSLog(@"paused");
break;
case MPMoviePlaybackStateInterrupted:
NSLog(@"interrupted");
break;
case MPMoviePlaybackStateSeekingForward:
NSLog(@"seeking forward");
break;
case MPMoviePlaybackStateSeekingBackward:
NSLog(@"seeking backward");
break;
default:
NSLog(@"Unexpected playback state");
break;
}
}
- (void)moviePlayerLoadStateDidChange {
MPMovieLoadState loadState = self.moviePlayerController.loadState;
if (loadState == MPMovieLoadStateUnknown) {
NSLog(@"unknown");
} else {
MPMovieLoadState loadStates[3] = {
MPMovieLoadStatePlayable, MPMovieLoadStatePlaythroughOK,
MPMovieLoadStateStalled
};
for (int i=0; i < 3; i++) {
switch (loadState & loadStates[i]) {
case MPMovieLoadStatePlayable:
NSLog(@"playable");
break;
case MPMovieLoadStatePlaythroughOK:
NSLog(@"playthroughOK");
break;
case MPMovieLoadStateStalled:
NSLog(@"stalled");
break;
default:
break;
}
}
}
NSLog(@"ContentURL: %@", self.moviePlayerController.contentURL);
}
@end
-Heath Borders
email@hidden
Twitter: heathborders
http://heath-tech.blogspot.com
On Mon, Mar 21, 2011 at 10:47 PM, Matt Neuburg <email@hidden> wrote:
> On Mon, 21 Mar 2011 16:04:52 -0500, Heath Borders <email@hidden> said:
>>I create an embedded MPMoviePlayerController thusly inside my loadView method:
>>
>>self.moviePlayerController = [[[MPMoviePlayerController alloc] init]
>>autorelease];
>>
>>// add to view, setup moviePlayerController's view frame, etc
>>
>>And I can later load a movie the user chooses thusly:
>>
>>NSURL *fileUrl = ...
>>self.moviePlayerController.contentURL = fileUrl;
>>
>>and everything works great.
>>
>>
>>However, if I set the contentURL again:
>>
>>NSURL *fileUrl2 = ...
>>self.moviePlayerController.contentURL = fileUrl2;
>>
>>This does not work, even if fileUrl2 == fileUrl1.
>>
>>When I change the contentURL, I get the following playbackState and loadState:
>>
>>After first setContentURL:
>>loadState == playable | playthroughOK
>>playbackState == playing
>>
>>After my second setContentURL:
>>playbackState == stopped
>>loadState == unknown
>>
>>I can of course create a new MPMoviePlayerController for every movie,
>>but I want to make sure this issue isn't indicative of a larger
>>problem.
>
> You shouldn't have to create a new MPMoviePlayerController. Setting the contentURL to a different URL works fine. Something else must be going on at your end. As always, my advice is: make a new project, reduce this to the absolute simplest possible case (an MPMoviePlayerController, its view, two embedded movies, and two buttons) and convince yourself. m.
>
> --
> matt neuburg, phd = email@hidden, <http://www.apeth.net/matt/>
> A fool + a tool + an autorelease pool = cool!
> Programming iOS 4!
> http://www.apeth.net/matt/default.html#iosbook
_______________________________________________
Cocoa-dev mailing list (email@hidden)
Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden