8
votes

I'm struggling to understand why this isn't working :/ Everytime I run the project the app crashes throwing me a 'NSInvalidArgumentException', reason: '* -[NSURL initFileURLWithPath:]: nil string parameter'

I've followed a tutorial (I'm pretty new to this) and it worked for him and the code is exactly the same.. Can anyone explain whats going on?

.h file

#import <UIKit/UIKit.h>
#import <MediaPlayer/MediaPlayer.h>
#import <QuartzCore/QuartzCore.h>

@interface FirstViewController : UIViewController {   
    MPMoviePlayerViewController *playerController;
}
-(IBAction)playVideo;
@end

.m file

#import "FirstViewController.h"

@interface FirstViewController ()

@end

@implementation FirstViewController

{
    MPMoviePlayerController *mpc;

}



- (IBAction)playButton:(id)sender {

    NSString *stringPath = [[NSBundle mainBundle]pathForResource:@"intro" ofType:@"MP4"];
    NSURL *url = [NSURL fileURLWithPath:stringPath];

    if(url != nil){

    mpc = [[MPMoviePlayerController alloc]initWithContentURL:url];

    [mpc setMovieSourceType:MPMovieSourceTypeFile];

    [[self view]addSubview:mpc.view];

    [mpc setFullscreen:YES];

    [mpc play];

    }
    else{
        NSLog(@"URL not found");

    }
}
@end
6
Before anyone asks Reece Darragh owns the dev account we're using. Thanks for your helpJordan Earle

6 Answers

34
votes

The only important part of all that is:

NSString *stringPath = [[NSBundle mainBundle] pathForResource:@"intro" ofType:@"MP4"];
NSURL *url = [NSURL fileURLWithPath:stringPath];

I assume the exception is raised inside the second line. Which would mean that stringPath was nil, which would happen if the file intro.MP4 was not actually in your app bundle.

Check that:

  • the file exists in your copy of the source code

  • your Xcode project has a reference to that file (if it's red, it means the file isn't actually present)

  • In your target in Xcode, look at "Build Phases" and reveal the "Copy Bundle Resources" build phase. That file should be present. If it isn't, press the + button and select it.

6
votes

Kurt's answer worked for me specifically the

"In your target in Xcode, look at "Build Phases" and reveal the "Copy Bundle Resources" build phase. That file should be present. If it isn't, press the + button and select it."

my movie file was missing. It must have been there before because it was working and then it just stopped.

I would have made a comment to Kurt's post but did not know how. I did "up vote".

1
votes

Make sure you add the audio files you are trying to play in Copy Bundle Resources.

  1. Click on Xcode Project Icon(First one in the Left Project Navigator)
  2. Click on Target
  3. Tap on Build Phases
  4. Go to Copy Bundle Resources
  5. Check if your audio files are available in the list.
  6. If not added, Add them by tapping on the + icon
  7. Build and Run
0
votes

In addition what's mentioned in this answer https://stackoverflow.com/a/14179186/3213411, you also want to make sure that the file you are referencing has membership in the build target. You can specify this in the File Inspector. This answer explains how https://stackoverflow.com/a/5300901/3213411

0
votes

Your video is too long. Using this code, the limit is 30 seconds. Your best bet is to stream it from a url. Try playing a video shorter then 30 seconds and it will work fine.

0
votes

iOS 9.2, Xcode 7.2, ARC enabled

I recently ran into this issue myself. Definitely do what the original contributors are suggesting. For me it was the actual name of the file that was the issue, see below...

NSString *pathForPuzzlePieceHitSound = [[NSBundle mainBundle] pathForResource:@"puzzle_piece_hit" ofType:@"m4a"];
NSURL *urlForPuzzlePieceHitSound = [NSURL fileURLWithPath:pathForPuzzlePieceHitSound];

AudioServicesCreateSystemSoundID((__bridge CFURLRef)urlForPuzzlePieceHitSound, &idForPuzzlePieceHitSound);

The file name:

@"puzzle_piece_hit"

Has characters in it that are illegal for file naming using this particular method. I guess you can treat it and get around the issue, but it is easier to just rename the file.

After I renamed to:

@"puzzlePieceHit"

Everything worked just fine.

Hope this helped someone! Cheers.