iOS Play video black screen?

ios

Solution

Create property for MPMoviePlayerController, because you retain view after adding it as subview, but not retain controller.

@property (strong, nonatomic) MPMoviePlayerController *player;

...

@synthesize player = _player;

...

- (IBAction)playVideo:(id)sender
{
    NSURL *videoUrl = [[DataStore singletonInstance] getVideoUrl:self withUuid:self.eventDetailVC.event.uuid];
    if ([videoUrl checkResourceIsReachableAndReturnError:nil] == NO)
    {
        NSLog(@"Video doesn't not exist.");
        return;
    }
    self.player = [[MPMoviePlayerController alloc] initWithContentURL:videoUrl];
    [[NSNotificationCenter defaultCenter] addObserver:self 
                                             selector:@selector(moviePlayBackDidFinish:) 
                                                 name:MPMoviePlayerPlaybackDidFinishNotification 
                                               object:nil];
    [previewView addSubview:_player.view];
    _player.view.frame = previewView.bounds;
    _player.controlStyle = MPMovieControlStyleDefault;
    [_player play];
}

- (void)moviePlayBackDidFinish:(NSNotification*)notification
{
    NSLog(@"moviePlayBackDidFinish: called");
    [[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerPlaybackDidFinishNotification 
                                                  object:nil];
    // Checking for errors
    NSDictionary *notiUserInfo = [notification userInfo];
    if (notiUserInfo != nil)
    {
        NSError *errorInfo = [notiUserInfo objectForKey:@"error"];
        if ([[errorInfo domain] isEqualToString:@"MediaPlayerErrorDomain"])
        {
            UIAlertView *notice = [[UIAlertView alloc] initWithTitle:@"Error" 
                                                             message:[errorInfo localizedDescription] 
                                                            delegate:self 
                                                   cancelButtonTitle:@"OK" 
                                                   otherButtonTitles:nil];
            [notice show];
            return;
        }
    }
    // Remove from view
    [_player.view removeFromSuperview];
    [_player stop];
    self.player = nil;
}

Problem

I have been browsing through Google for various explanations but I STILL couldn't figure out when this code fires the screen is pitch black. Anyone able to spot a mistake? UPDATE ``` - (IBAction)playVideo:(id)sender { NSURL *videoUrl = [[DataStore singletonInstance] getVideoUrl:self withUuid:self.eventDetailVC.event.uuid]; if ([videoUrl checkResourceIsReachableAndReturnError:nil] == NO) { NSLog(@"Video doesn't not exist."); return; } MPMoviePlayerController *player = [[MPMoviePlayerController alloc] initWithContentURL:videoUrl]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moviePlayBackDidFinish:) name:MPMoviePlayerPlaybackDidFinishNotification object:player]; [previewView addSubview:player.view]; player.view.frame = previewView.bounds; player.controlStyle = MPMovieControlStyleDefault; [player play]; } - (void)moviePlayBackDidFinish:(NSNotification*)notification { NSLog(@"moviePlayBackDidFinish: called"); MPMoviePlayerController *player = [notification object]; [[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerPlaybackDidFinishNotification object:player]; // Checking for errors NSDictionary *notiUserInfo = [notification userInfo]; if (notiUserInfo != nil) { NSError *errorInfo = [notiUserInfo objectForKey:@"error"]; if ([[errorInfo domain] isEqualToString:@"MediaPlayerErrorDomain"]) { UIAlertView *notice = [[UIAlertView alloc] initWithTitle:@"Error" message:[errorInfo localizedDescription] delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; [notice show]; return; } } // Remove from view [player.view removeFromSuperview]; [player stop]; } ``` FYI moviePlayBackDidFinish is NOT called at all. I don't know why.

Original source