Search code examples
iphoneobjective-ciosmpmovieplayercontrollermpmovieplayer

How to play video using MPMoviePlayerController?


I am using the following code to play the video using the MPMoviePlayerController , but the video is not played. Can anyone tell me why ?

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"/one.mp4"];

NSString *mediaPath = [[[NSBundle mainBundle]resourcePath] stringByAppendingPathComponent:filePath];

    MPMoviePlayerController *moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:[NSURL fileURLWithPath:mediaPath]];

    [[moviePlayer view] setFrame:[[self view] bounds]];
    [[self view] addSubview: [moviePlayer view]];


    moviePlayer.scalingMode = MPMovieScalingModeAspectFit;

    [moviePlayer play];

Solution

  • It's pretty weird, but it seems to work okay if you make your MPMoviePlayerController a property instead of a local variable. Seems something is going on behind the scenes. I'm thinking it's related to ARC. Are you using ARC?

    It's also an issue that you've over-appended your path:

    // You've already got the full path to the documents directory here.
    NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"/one.mp4"];
    // Now you're appending the full path to the documents directory to your bundle path
    NSString *mediaPath = [[[NSBundle mainBundle]resourcePath] stringByAppendingPathComponent:filePath];
    

    When I run your code in the simulator, the path looks like this:

    /Users/mlong/Library/Application Support/iPhone Simulator/5.1/Applications/8CFB9B94-BD6A-442C-A525-573FE343506D/VidoePlayer.app/Users/mlong/Library/Application Support/iPhone Simulator/5.1/Applications/8CFB9B94-BD6A-442C-A525-573FE343506D/Documents/one.mp4

    It should just be this:

    /Users/mlong/Library/Application Support/iPhone Simulator/5.1/Applications/8CFB9B94-BD6A-442C-A525-573FE343506D/Documents/one.mp4

    So just delete this line:

    NSString *mediaPath = [[[NSBundle mainBundle]resourcePath] stringByAppendingPathComponent:filePath];
    

    And then change your player instantiation to this:

    _moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:[NSURL fileURLWithPath:filePath]];
    
    [[_moviePlayer view] setFrame:[[self view] bounds]];
    [[self view] addSubview: [_moviePlayer view]];
    
    _moviePlayer.scalingMode = MPMovieScalingModeAspectFit;
    
    [_moviePlayer play];
    

    So you should add the MPMoviePlayerController as a property of your containing view controller.