• Open Menu Close Menu
  • Apple
  • Shopping Bag
  • Apple
  • Mac
  • iPad
  • iPhone
  • Watch
  • TV
  • Music
  • Support
  • Search apple.com
  • Shopping Bag

Lists

Open Menu Close Menu
  • Terms and Conditions
  • Lists hosted on this site
  • Email the Postmaster
  • Tips for posting to public mailing lists
Re: MPMoviePlayerController setContentURL twice
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

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

References: 
 >Re: MPMoviePlayerController setContentURL twice (From: Matt Neuburg <email@hidden>)

  • Prev by Date: Re: MPMoviePlayerController setContentURL twice
  • Next by Date: Re: UIWebView HTML to match UITextView
  • Previous by thread: Re: MPMoviePlayerController setContentURL twice
  • Next by thread: Re: MPMoviePlayerController setContentURL twice
  • Index(es):
    • Date
    • Thread