MPMoviePlayerController gives me a black empty vie

2019-06-16 07:34发布

问题:

iOS 5.1 ,here is the code:

 MPMoviePlayerController *player =
    [[MPMoviePlayerController alloc] initWithContentURL: [NSURL URLWithString:@"map.mp4"]];
    [player prepareToPlay];
    [player.view setFrame: self.view.bounds];  // player's frame must match parent's
    [self.view addSubview: player.view];
    // ...
    [player play];

in fact ,this is just the same as the apple reference say,but when I click the button to use this function,there is just a black Rectangle stay there,no vedio playing ,no sound happening,and no crush,so I want to know how to make this work

回答1:

Sorry for very late reply. The Solution is kind of wierd. But it helped me keep going while facing the same issue.

MPMovieSourceTypeStreaming is the thing you have missed.

MPMoviePlayerController *player =
[[MPMoviePlayerController alloc] initWithContentURL: [NSURL URLWithString:@"map.mp4"]];
[player prepareToPlay];
[player.view setFrame: self.view.bounds];  // player's frame must match parent's
player.movieSourceType    = MPMovieSourceTypeStreaming;
[self.view addSubview: player.view];
// ...
[player play];


回答2:

You may be sending your

[player play] 

message too soon.

Use the following notification observation

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playMovie:) name:MPMoviePlayerLoadStateDidChangeNotification object:player];

To listen for the loadState to change to playable. To check for that update do this :

- (void)playMovie:(NSNotification *)notification {
    MPMoviePlayerController *player = notification.object;
    if (player.loadState & MPMovieLoadStatePlayable)
    {
        NSLog(@"Movie is Ready to Play");
        [player play];
    }
}

The movie should begin playing once it's ready.



回答3:

Try this below code for play video from your project Resource :

  NSBundle *bundle = [NSBundle mainBundle];
  NSString *moviePath = [bundle pathForResource:@"map" ofType:@"mp4"];
  NSURL *movieURL = [[NSURL fileURLWithPath:moviePath] retain];

  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];

Thanks..!



回答4:

Building on @Dinesh's answer, your URL creation is incorrect. The value of

[NSURL URLWithString:@"map.mp4"]

will be nil since @"map.mp4" is not a valid URL. To create a valid url from the app's bundle do what Dinesh says. To create a remote URL you would do something like

[NSURL URLWithString:@"http://www.jplayer.org/video/m4v/Big_Buck_Bunny_Trailer.m4v"]

The URL should contain all it's parts: protocol, host, path, file.

Cheers, Felipe



回答5:

Add your movie player controller view on main windows like:

 MPMoviePlayerController *player =
    [[MPMoviePlayerController alloc] initWithContentURL: [NSURL URLWithString:@"map.mp4"]];
    [player prepareToPlay];
    [player.view setFrame: self.view.bounds];

AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
[appDelegate.window addSubview: player.view];

[player play];

Hope so it will work!



回答6:

Your player should be a property of your view controller, something like this:

.h:

@property(nonatomic,weak)MPMoviePlayerController *moviePlayer;

.m:

    MPMoviePlayerController *player =
    [[MPMoviePlayerController alloc] initWithContentURL: [NSURL URLWithString:@"map.mp4"]];
    [player prepareToPlay];
    [player.view setFrame: self.view.bounds];  // player's frame must match parent's
    //set the player to your property
    self.moviePlayer=player;

    [self.view addSubview: self.moviePlayer.view];
    // ...
    [self.moviePlayer play];


回答7:

Please use MPMoviePlayerViewController Because of MP4 file. When you use MOV then working perfect!!

MPMoviePlayerViewController *moviePlayerViewController;

-(void)PlayVideoController:(NSString*)videoUrl1 { 
    NSURL *fileURL = [NSURL URLWithString:videoUrl1]; 
    moviePlayerViewController = [[MPMoviePlayerViewController alloc] initWithContentURL:fileURL];

    // Register for the playback finished notification.
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(myMovieFinishedCallback:) name:MPMoviePlayerPlaybackDidFinishNotification object:moviePlayerViewController.moviePlayer];

    //Present
    [self presentMoviePlayerViewControllerAnimated:moviePlayerViewController];

    // Play the movie!
    moviePlayerViewController.moviePlayer.movieSourceType = MPMovieSourceTypeFile;
    [moviePlayerViewController.moviePlayer play];
}

-(void)myMovieFinishedCallback:(NSNotification*)aNotification {
    [[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerPlaybackDidFinishNotification object:moviePlayerViewController.moviePlayer];
    [moviePlayerViewController release], moviePlayerViewController = nil;
}


回答8:

You might want to cross check video url for blank spaces. Following code works for me.

- (IBAction)btnPlayVideo:(id)sender {

    self.strVideoUrl = [self.strVideoUrl stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    NSURL    *fileURL    =   [NSURL URLWithString:[NSString stringWithFormat:@"%@", self.strVideoUrl]];
    NSLog(@"Url to play = %@", self.strVideoUrl);

        self.moviePlayerController = [[MPMoviePlayerController alloc] initWithContentURL:fileURL];

        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(moviePlaybackComplete:)
                                                     name:MPMoviePlayerPlaybackDidFinishNotification
                                                   object:self.moviePlayerController];
        [self.moviePlayerController.view setFrame:self.view.bounds];
        [self.view addSubview:self.moviePlayerController.view];
        self.moviePlayerController.shouldAutoplay = YES;
        self.moviePlayerController.fullscreen = YES;
        self.moviePlayerController.controlStyle=NO;
        [self.moviePlayerController prepareToPlay];
        self.moviePlayerController.movieSourceType = MPMovieSourceTypeStreaming;

        [self.moviePlayerController play];

}

- (void)moviePlaybackComplete:(NSNotification *)notification
{
    self.moviePlayerController = [notification object];
    [[NSNotificationCenter defaultCenter] removeObserver:self
                                                    name:MPMoviePlayerPlaybackDidFinishNotification
                                                  object:self.moviePlayerController];

    [self.moviePlayerController.view removeFromSuperview];
    self.closeVideAdProp.hidden = NO;
    btnCloseAd.hidden=FALSE;
}