-(void)playVideo:(NSURL *)url{
if (videoPlayer) {
[videoPlayer release];
videoPlayer = nil;
}
videoPlayer = [[MPMoviePlayerViewController alloc] initWithContentURL:url];
url = nil;
videoPlayer.moviePlayer.controlStyle=MPMovieControlStyleFullscreen;
videoPlayer.view.autoresizingMask = (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight);
videoPlayer.moviePlayer.scalingMode = MPMovieScalingModeAspectFit;
videoPlayer.view.backgroundColor = [UIColor blackColor];
[[UIApplication sharedApplication]
setStatusBarStyle:UIStatusBarStyleBlackTranslucent animated:NO];
[videoPlayer.moviePlayer prepareToPlay];
videoPlayer.moviePlayer.shouldAutoplay = YES;
videoPlayer.hidesBottomBarWhenPushed = YES;
self.navigationController.navigationBarHidden=NO;
videoPlayer.navigationItem.hidesBackButton = YES;
[self.navigationController pushViewController:videoPlayer animated:YES];
[self addObservers];
}
Can anyone say what is wrong with this code? The url is streaming http link. Video player is appearing but after a while it disappears. It is working in 3G network but not in wifi
As you are saying that it was working on 3G but not on WiFi Network, your issue is most likely not related to the code but to the movie-file/s you are testing.
Make sure the m3u8-snippet is complete and valid also for low bandwidth. Test the m3u8 with Apples Mediastream Validator as described by this Best Practice Guide and this Article.
After this line:
videoPlayer = [[MPMoviePlayerViewController alloc] initWithContentURL:url];
add this:
[videoPlayer retain];
Related
I am playing video in MPMoviePlayer in my app,I am fetching the video from server.
If the video length is about 25sec or more,the audio gets break.Means while playing the video when it reaches half then there is no audio can be heared.But if I seek the progess bar,audio again comes.
Can any one help me in this ?
moviePlayerController = [[MPMoviePlayerController alloc] init];
[moviePlayerController prepareToPlay];
moviePlayerController.shouldAutoplay = YES;
[moviePlayerController setScalingMode:MPMovieScalingModeAspectFit];
[[self.moviePlayerController view] setFrame:CGRectMake(0, 72, 320,180)];
[[self view] addSubview: [self.moviePlayerController view]];
self.moviePlayerController.useApplicationAudioSession = YES;
NSString *strng = #"http://qdemo_videos.s3.amazonaws.com/1360582540.mp4";
NSURL * adurl = [NSURL URLWithString:strng];
moviePlayerController.contentURL = url;
moviePlayerController.controlStyle = YES;
self.moviePlayerController.useApplicationAudioSession = YES;
[moviePlayerController play];
If u are building on Xcode 4.6 or above and using iOS 6.0 or above then,
self.moviePlayerController.useApplicationAudioSession = YES;
will not be called as its deprecated.
For further use this link:
Here's the doc
http://developer.apple.com/library/ios/#documentation/AVFoundation/Reference/AVAudioSession_ClassReference/Reference/Reference.html
Here's the explanation http://developer.apple.com/library/ios/#documentation/Audio/Conceptual/AudioSessionProgrammingGuide/Configuration/Configuration.html
And if it's not enough here is the code :) http://developer.apple.com/library/ios/#documentation/Audio/Conceptual/AudioSessionProgrammingGuide/Cookbook/Cookbook.html#//apple_ref/doc/uid/TP40007875-CH6-SW2
In my case setting the category to AVAudioSessionCategoryAmbient did the trick!
I am trying to implement video into my app and I am having a hard time. I have tried this tutorial and it was super helpful.
But now when I try to run my app and click on the button, the video frame comes up and just stays black. My video is in the correct format, I also made sure that I am pulling in the MediaPlayer Framework. Has anyone ran into this issue before or knows why this would be happening?
This is what I have:
-(IBAction)playMovie:(id)sender
{
UIButton *playButton = (UIButton *) sender;
NSString *filepath = [[NSBundle mainBundle] pathForResource:#"big-buck-bunny-clip" ofType:#"m4v"];
NSURL *fileURL = [NSURL fileURLWithPath:filepath];
MPMoviePlayerController *moviePlayerController = [[MPMoviePlayerController alloc] initWithContentURL:fileURL];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:#selector(moviePlaybackComplete:)
name:MPMoviePlayerPlaybackDidFinishNotification
object:moviePlayerController];
[moviePlayerController.view setFrame:CGRectMake(38, 100, 250, 163)];
[self.view addSubview:moviePlayerController.view];
//moviePlayerController.fullscreen = YES;
moviePlayerController.initialPlaybackTime = 5;
[moviePlayerController play];
}
Have you added MPMoviePlayerController's view onto your view?
MPMoviePlayerController *movieController = ...;
movieController.view.frame = self.view.bounds;
[self.view addSubview:movieController.view];
Frame could also be black if you've set shouldAutoplay to YES and controlStyle to MPMovieControlStyleNone
--Edit
This is how I init my player and it works, maybe that will be of some help. It's playing HTTP Live Streaming video, but it'll play anything you put into it. You should try the url in this sample. If it'll work then there's definitely some problem with your contentUrl.
url = [NSURL URLWithString:#"http://devimages.apple.com/iphone/samples/bipbop/bipbopall.m3u8"];
self.moviePlayerController = [[MPMoviePlayerController alloc] initWithContentURL:url];
moviePlayerController.view.frame = self.view.bounds;
[self.view insertSubview:moviePlayerController.view atIndex:0];
moviePlayerController.controlStyle = MPMovieControlStyleNone;
moviePlayerController.shouldAutoplay = YES;
[moviePlayerController prepareToPlay];
I had the same problem, and also following the same tutorial, but then I found the class moviePlayerViewController that its easier to use and you don't even have to worry about dismiss buttons.
I fixed used the following code: (I think it works better with ios5)
self.moviePlayerViewController = [[MPMoviePlayerViewController alloc] initWithContentURL:finalurl];
moviePlayerViewController.view.frame = self.view.bounds;
[self presentMoviePlayerViewControllerAnimated:moviePlayerViewController];
moviePlayerViewController.moviePlayer.controlStyle = MPMovieControlStyleFullscreen;
moviePlayerViewController.moviePlayer.shouldAutoplay = YES;
[moviePlayerViewController.moviePlayer prepareToPlay];
moviePlayerViewController.moviePlayer.fullscreen=YES;
My code was working fine until I upgraded iPhone to iOS 5.0. The MPMoviePlayerViewController used to work fine but it doesn't work on iOS 5.0 so I have to use MPMoviePlayerController for iOs 5.0 and later versions. It works fine but MPMoviePlayerController doesn't rotate automatically like it used to do with MPMoviePlayerViewController.
Following is my code. Could anyone please suggest me how to make MPMoviePlayerController code rotate automatically?
-(void)playVideo {
NSString *filePath = [appDelegate filePath:#"startup.mp4"];
if(!appDelegate.iOS5) {
// This works perfectly till iOS 4 versions. Rotates automatically
MPMoviePlayerViewController *videoController = [[[MPMoviePlayerViewController alloc] initWithContentURL:[NSURL URLWithString:filePath]] autorelease];
[self presentMoviePlayerViewControllerAnimated:videoController];
} else {
// This doesn't rotate automatically
NSURL *url = [NSURL fileURLWithPath:filePath];
MPMoviePlayerController* moviePlayer = [[[MPMoviePlayerController alloc] initWithContentURL:url] autorelease];
moviePlayer.controlStyle = MPMovieControlStyleDefault;
moviePlayer.shouldAutoplay = YES;
[self.view addSubview:moviePlayer.view];
[moviePlayer setFullscreen:YES animated:YES];
}
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
{
return YES;
}
Try subclassing MPMoviePlayerController and forcing the orientation to portrait only.
- (BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
return (toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft || toInterfaceOrientation == UIInterfaceOrientationLandscapeRight);
}
Not the best solution but I guess it should work.
I have a navigation controller that pushes another view which plays video files. Everything is working fine and on the simulator there is no problem at all. The problem is when I test the application on the iPhone, the movies play well but if I press the home button on the iPhone then I launch the app again I receive the following warning in Xcode Debugging area:
2011-11-21 20:23:05.216 KMW[324:707] MP _playbackInterruptionDidEndNotification :: NSConcreteNotification 0x164e90 {name = AVController_PlaybackInterruptionDidEndNotification;
object = ; userInfo = {
"AVController_InterruptionStatusNotificationParameter" = "non-resumable.SoloAmbientSound";
"AVController_InterruptorNameNotificationParameter" = "AudioSession-324"; }}, _state = 0
Although this warning is appearing I can continue using the App and watch movies without any problem but I am afraid that in a certain situation this warning causes a problem. Here is how I am setting up the view that plays the movies:
- (void) viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
NSString *path = [[NSBundle mainBundle] pathForResource:#"movieFileName" ofType:#"m4v"];
movieURL = [NSURL fileURLWithPath:path];
self.moviePlayer = [[[MPMoviePlayerController alloc] initWithContentURL:movieURL] autorelease];
[self.view addSubview:moviePlayer.view];
moviePlayer.view.frame = CGRectMake(0, 10, 320, 181);
[moviePlayer setControlStyle:MPMovieControlStyleNone];
[moviePlayer play];
}
- (void) viewWillDisappear:(BOOL)animated
{
[moviePlayer stop];
[moviePlayer.view removeFromSuperview];
}
- (void)dealloc
{
[movieURL release];
[moviePlayer release];
[super dealloc];
}
Any ideas about this strange warning?
The following code used to work but now it doesn't and I have not changed anything about it.
if ([self respondsToSelector:#selector(presentMoviePlayerViewControllerAnimated:)]) {
MPMoviePlayerViewController *moviePlayer = [[MPMoviePlayerViewController alloc] initWithContentURL:[NSURL URLWithString:selectedLink]];
[self presentMoviePlayerViewControllerAnimated:moviePlayer];
[moviePlayer release];
}
else {
MPMoviePlayerController *moviePlayer = [[[MPMoviePlayerController alloc] initWithContentURL:[NSURL URLWithString:selectedLink]] autorelease];
[moviePlayer play];
}
So if the OS supports the method presentMoviePlayerViewControllerAnimated we use this approach but if its OS < 3.2 we use the old method but this doesn't work anymore on my iPhone 1st gen OS 3.0.1 or iPod Touch 2nd gen OS 3.1.3. Nothing happens when the code is fired.
Hope you can help me.
Cheers
Ahh its the autorelease part which is doing the wreckage.
From
MPMoviePlayerController *moviePlayer = [[[MPMoviePlayerController alloc] initWithContentURL:[NSURL URLWithString:selectedLink]] autorelease];
[moviePlayer play];
to
MPMoviePlayerController *moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:[NSURL URLWithString:selectedLink]];
[moviePlayer play];
Cheers
I guess you shall set the MPMoviePlayerController view frame to the CGRect you want to display it and then add this view as a subview before playing. Have a look at Apple Documentation