MPMoviePlayerController backward buffer video again - ios

I am using a MPMoviePlayerController to play video from server.it's work fine,no issue.Now once i play buffered video and then go backward it start to buffered again. Is that a encoding issue or any other.Any help or suggestion would be appreciate

Try below code
#import <MediaPlayer/MediaPlayer.h>
#property (strong, nonatomic) MPMoviePlayerController *streamPlayer;
NSURL *streamURL = [NSURL URLWithString:#"http://clips.vorwaerts-gmbh.de/VfE_html5.mp4"];
_streamPlayer = [[MPMoviePlayerController alloc] initWithContentURL:streamURL];
// depending on your implementation your view may not have it's bounds set here
// in that case consider calling the following 4 msgs later
//http://qthttp.apple.com.edgesuite.net/1010qwoeiuryfg/sl.m3u8
[self.streamPlayer.view setFrame: self.view.bounds];
self.streamPlayer.controlStyle = MPMovieControlStyleDefault;
[self.view addSubview: self.streamPlayer.view];
[self.streamPlayer play];

Related

How to display AVPictureInPictureController?

I'm trying to play video using AVPictureInPictureController which was introduced recently in IOS9, using this code :
AVPlayer *_AVPlayer = [AVPlayer playerWithURL:url];
AVPlayerLayer *_layer = [AVPlayerLayer playerLayerWithPlayer:_AVPlayer];
_layer.frame = [[UIApplication sharedApplication] delegate].window.bounds;
AVPictureInPictureController *_AVPictureInPictureController = [[AVPictureInPictureController alloc] initWithPlayerLayer:_layer];
_AVPictureInPictureController.delegate = self;
But how can I display the _AVPictureInPictureController in the screen??
I tried
[self presentViewController:_AVPictureInPictureController animated:YES completion:nil];
and
[self presentMoviePlayerViewControllerAnimated:_AVPictureInPictureController];
But it didn't work ):
Also I tried
[self.view.layer addSublayer: layer];
But i shows only AVPlayer on the screen without buttons or controls ..
I used to work with MPMoviePlayerViewController but as it is formally deprecated in iOS 9, I can't use it any more ..
So could You help me to display the _AVPictureInPictureController !!
Thanks in advance
As i checking the documentation about AVPictureInPictureController and also Apple sample code in Swift about AVPictureInPictureController. there is not player. in doc you need to create a Button. and that you need to check for the current video is sported AVPictureInPictureController or not like following.
Fist you need to set up AVAudioSessionCategoryPlayback. you need to do the Xcode Capabilities view for your project, select Audio and AirPlay in the Background Modes section.
In to you app delegate you need to set following code:
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
[[AVAudioSession sharedInstance] setActive: YES error: nil];
Now You need to do code for playing video using AVPlayer using following code:
- (void)viewDidLoad {
[super viewDidLoad];
NSString *path = [[NSBundle mainBundle] pathForResource:#"samplemovie" ofType:#"mov"];
NSURL *url = [NSURL fileURLWithPath:path];
self.AVPlayer = [AVPlayer playerWithURL:url];
self.layer = [AVPlayerLayer playerLayerWithPlayer:_AVPlayer];
//_layer.frame = [[UIApplication sharedApplication] delegate].window.bounds;
[self.layer setFrame:CGRectMake(0, 0, self.view.frame.size.width-100, self.view.frame.size.height-72)];
[self.layer setVideoGravity:AVLayerVideoGravityResize];
[self.view.layer addSublayer:_layer];
[_AVPlayer play];
[self setupSuport]; //Here you need to check that `AVPictureInPictureController` is supported or not with another method
}
-(void)setupSuport
{
if([AVPictureInPictureController isPictureInPictureSupported])
{
_AVPictureInPictureController = [[AVPictureInPictureController alloc] initWithPlayerLayer:_layer];
_AVPictureInPictureController.delegate = self;
}
else
{
// not supported PIP start button desable here
}
}
Here is The button toggle code for PIP if supported:
-(IBAction)actionPIPStart:(UIButton*)sender
{
if (_AVPictureInPictureController.pictureInPictureActive) {
[_AVPictureInPictureController stopPictureInPicture];
}
else {
[_AVPictureInPictureController startPictureInPicture];
}
}
You can get now check with its delegate:
- (void)pictureInPictureController:(AVPictureInPictureController *)pictureInPictureController restoreUserInterfaceForPictureInPictureStopWithCompletionHandler:(void (^)(BOOL restored))completionHandler;
- (void)pictureInPictureControllerDidStopPictureInPicture:(AVPictureInPictureController *)pictureInPictureController;
- (void)pictureInPictureControllerDidStartPictureInPicture:(AVPictureInPictureController *)pictureInPictureController;
- (void)pictureInPictureControllerWillStopPictureInPicture:(AVPictureInPictureController *)pictureInPictureController;
- (void)pictureInPictureController:(AVPictureInPictureController *)pictureInPictureController failedToStartPictureInPictureWithError:(NSError *)error;
- (void)pictureInPictureControllerWillStartPictureInPicture:(AVPictureInPictureController *)pictureInPictureController;
NOTE: Above code is just for sample and might be your video screen not be full fill in screen of device.
Hope that information helps to you and might be your issue goign to be solve for more deep read apple doc. AVPictureInPictureController
Just use AVPlayerViewController instread, for details please check https://developer.apple.com/library/ios/documentation/WindowsViews/Conceptual/AdoptingMultitaskingOniPad/QuickStartForPictureInPicture.html

Play video in fullscreen while click playbutton

I have video play play. I'm displaying the video in center of the view adjusting of CGRectMake. But when i click the play button i need to play video in full screen mode automatically without pressing maximize icon. Is it possible?
MPMoviePlayerController *moviePlayerController = [[MPMoviePlayerController alloc] initWithContentURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:#"solar" ofType:#"mp4"]]];
[[moviePlayerController view] setFrame:CGRectMake(172, 210, 680, 400)];
[moviePlayerController setShouldAutoplay:NO];
[moviePlayerController setControlStyle:MPMovieControlStyleEmbedded];
[[moviePlayerController backgroundView] setBackgroundColor:[UIColor clearColor]];
[moviePlayerController prepareToPlay];
[self.view addSubview:moviePlayerController.view];
Set MoviePlayer to FullScreen by below method
mpviewController.moviePlayer.controlStyle = MPMovieControlStyleFullscreen;
[self presentModalViewController:mpviewController animated:NO];
This will embed your video to your iOS app:
Add MediaPlayer.framework
Add your video to the root of your project
In your .h file add the following
#property(nonatomic, strong) MPMoviePlayerViewController *moviePlayer; - Put this under #interface ViewController :UIViewController;
in your .m file, add the following
#synthesize moviePlayer; -Put this under #implementation ViewController
NSString *videoPath = [[NSBundle mainBundle] pathForResource:#"your video name" ofType:#"mp4"];
NSURL *videoURL = [NSURL fileURLWithPath:videoPath];
moviePlayer = [[MPMoviePlayerViewController alloc] initWithContentURL:videoURL];
[self presentMoviePlayerViewControllerAnimated:moviePlayer];
First try to use add observer pattern to know when movie player begins
to play at that time switch it to full screen mode. I am giving you
the link just check it. It may help you . In this link the observer
pattern is used for checking whether the player is enter on fullscreen
and in selector method what he wants to do he did. So u can also use
same methodology and instead of checking for fullscreen u should check
for play begin and on selector method set it to full screen..
MPMoviePlayerController stops working in full screen mode // portrait orientation // iOS 7

MPMoviePlayerController shows blank screen or crashes app

I have a UIViewController subclass called videoPlayerViewController.
In storyboard I dragged out a UIViewController. I set the class correctly in Storyboard.
I put a button on the screen. When I click the button, it executes the method playVideo:.
- (IBAction)playVideo:(id)sender
{
NSURL *movieURL = [NSURL URLWithString:#"http://www.ebookfrenzy.com/ios_book/movie/movie.mov"];
MPMoviePlayerController *player =
[[MPMoviePlayerController alloc] initWithContentURL: movieURL];
[player prepareToPlay];
[player.view setFrame: self.view.bounds]; // player's frame must match parent's
[self.view addSubview: player.view];
[player play];
}
I get a black screen that does nothing.
This is the simplest version of the code I've had in this method over the last 6 hours.
I've tried every StackOverflow answer out there.
I just want to play a video that I stream from the internet.
If I set:
player.movieSourceType = MPMovieSourceTypeStreaming;
the screen reads "loading" for a second, and then crashes.
What exactly am I doing wrong?
I understand there are so many MPMoviePlayerController questions out there, and to just ask a general "How does it work" question seems ludicrous. I've been at this almost 6 hours now and no Google/Stack Overflow/Apple Documentation search has made this work.
I used your provided code but created a MoviePlayerController property named mcp in the header file that I assigned to player to after creating it. That worked for me. The movie loaded and played just fine.
In the .h file:
#property (strong, nonatomic) MPMoviePlayerController *mcp;
In the .m file:
- (IBAction)playVideo:(id)sender
{
NSURL *movieURL = [NSURL URLWithString:#"http://www.ebookfrenzy.com/ios_book/movie/movie.mov"];
MPMoviePlayerController *player = [[MPMoviePlayerController alloc] initWithContentURL: movieURL];
[player prepareToPlay];
[player.view setFrame: self.view.bounds]; // player's frame must match parent's
_mcp = player;
[self.view addSubview: _mcp.view];
[_mcp play];
}

iOS: MPMoviePlayer won't play

Using the code at the bottom of this post I can successfully display a movie. However I need to now use moviePlayer as a property rather than a local variable. So by adding the following in the header file:
#property (retain, nonatomic) MPMoviePlayerController *mPlayer;
...and synthesizing it as:
#synthesize mPlayer = _mPlayer
Here's the original code. This works fine. All I change is the initialisation line where instead of using a local variable I use the property. A
MPMoviePlayerController * mPlayer = [[[MPMoviePlayerController alloc] initWithContentURL:videoURL] autorelease];
mPlayer.shouldAutoplay=YES;
[self.welcomeImage setUserInteractionEnabled:YES];
[mPlayer.view setFrame: self.welcomeImage.bounds]; // player's frame must match parent's
[self.welcomeImage addSubview:mPlayer.view];
mPlayer.scalingMode = MPMovieScalingModeAspectFit;
mPlayer.controlStyle = MPMovieControlStyleEmbedded;
[mPlayer prepareToPlay];
[mPlayer play];
I just get a black box, no controls or video. What am I doing wrong?
Your not using your synthesized property. Change mPlayer to _mPlayer.
_mPlayer = [[[MPMoviePlayerController alloc] initWithContentURL:videoURL] autorelease];
_mPlayer.shouldAutoplay=YES;
[self.welcomeImage setUserInteractionEnabled:YES];
[_mPlayer.view setFrame: self.welcomeImage.bounds]; // player's frame must match parent's
[self.welcomeImage addSubview:_mPlayer.view];
_mPlayer.scalingMode = MPMovieScalingModeAspectFit;
_mPlayer.controlStyle = MPMovieControlStyleEmbedded;
[_mPlayer prepareToPlay];
[mPlayer play];
This should work as long your videoURL is valid.

How do I stop a video from playing when switching to another ViewController?

I have this could which allows me to play a youtube video within my ipad app. However when I switch views, the video does not stop playing in the background. Do I have to add anything to make it stop playing when the views switch?
- (void)viewDidLoad
{
[super viewDidLoad];
NSURL *videoURL = [NSURL URLWithString:#"http://www.youtube.com/embed/123456"];
NSURLRequest *requestObj = [NSURLRequest requestWithURL:videoURL];
UIWebView * YoutubeVideo = [[UIWebView alloc] init];
YoutubeVideo.frame = CGRectMake(176,243,556,335);
[self.view addSubview:YoutubeVideo];
[YoutubeVideo loadRequest:requestObj];
}
-(void)viewWillDisappear:(BOOL)animated
{
[self.YoutubeVideo loadHTMLString:nil baseURL:nil];
}
This should work.When the view disappears, webview have nothing and when view comes back in viewWillAppear instead of viewDidLoad, load the video again, keep the youtubeVideo webview as a property so that you can access it in every method.
Youtube has provided its player called YTPlayer. You can import its library, and use as follow:
In your podfile, you should have this line:
pod "youtube-ios-player-helper", "~> 0.1.4"
In the ViewController.h file you have to:
a. Import the YTPlayer.h file:
#import "YTPlayer.h"
b. Define this within the interface:
#property(nonatomic, strong) IBOutlet YTPlayerView *playerView;
In the ViewController.m file, you have this function:
(void)viewWillDisappear: (BOOL)animated {
[self.playerView stopVideo];
}
It works for me.

Resources