我很难理解为什么这不起作用:/每次我运行项目时,应用程序崩溃都会给我一个'NSInvalidArgumentException',原因是:' * - [NSURL initFileURLWithPath:]: nil字符串参数'
我已经按照教程(我对此很新)并且它对他起作用并且代码完全相同..任何人都可以解释最新情况吗?
.h文件
#import <UIKit/UIKit.h>
#import <MediaPlayer/MediaPlayer.h>
#import <QuartzCore/QuartzCore.h>
@interface FirstViewController : UIViewController {
MPMoviePlayerViewController *playerController;
}
-(IBAction)playVideo;
@end
.m文件
#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
答案 0 :(得分:34)
所有这一切中唯一重要的部分是:
NSString *stringPath = [[NSBundle mainBundle] pathForResource:@"intro" ofType:@"MP4"];
NSURL *url = [NSURL fileURLWithPath:stringPath];
我假设在第二行内引发异常。这意味着stringPath
为零,如果文件intro.MP4
实际上不在您的应用包中,则会发生这种情况。
检查:
该文件存在于您的源代码副本
您的Xcode项目有对该文件的引用 (如果它是红色,则表示该文件实际上并不存在)
在Xcode的目标中,查看&#34; Build Phases&#34;并揭示&#34;复制捆绑资源&#34;建设阶段。该文件应该存在。如果不是,请按+按钮并选择它。
答案 1 :(得分:6)
Kurt的回答特别适用于我
“在Xcode的目标中,查看”Build Phases“并显示”Copy Bundle Resources“构建阶段。该文件应该存在。如果不存在,请按+按钮并选择它。”
我的电影文件丢失了。它一定是在那之前因为它正在工作然后它就停止了。
我会对库尔特的帖子发表评论,但不知道怎么做。我做了“投票”。
答案 2 :(得分:0)
除了本回答https://stackoverflow.com/a/14179186/3213411中提到的内容之外,您还需要确保您引用的文件具有构建目标的成员资格。您可以在文件检查器中指定它。这个答案解释了https://stackoverflow.com/a/5300901/3213411
的方式答案 3 :(得分:0)
您的视频太长了。使用此代码,限制为30秒。你最好的选择是从网址流式传输它。尝试播放短于30秒的视频,它会正常工作。
答案 4 :(得分:0)
iOS 9.2,Xcode 7.2,启用了ARC
我最近自己遇到过这个问题。绝对做原始贡献者的建议。对我来说,这是问题的文件的实际名称,见下文......
NSString *pathForPuzzlePieceHitSound = [[NSBundle mainBundle] pathForResource:@"puzzle_piece_hit" ofType:@"m4a"];
NSURL *urlForPuzzlePieceHitSound = [NSURL fileURLWithPath:pathForPuzzlePieceHitSound];
AudioServicesCreateSystemSoundID((__bridge CFURLRef)urlForPuzzlePieceHitSound, &idForPuzzlePieceHitSound);
文件名:
@"puzzle_piece_hit"
其中的字符对于使用此特定方法进行文件命名是非法的。我想你可以对它进行处理并解决问题,但重命名文件会更容易。
我改名为:
@"puzzlePieceHit"
一切都运转良好。
希望这有助于某人!欢呼声。
答案 5 :(得分:0)
确保将要播放的音频文件添加到“副本捆绑资源”中。