无法从主捆绑包播放MP4视频文件

23

我正在尝试播放一个简单的引导动画视频文件,我已经将其拖入XCode项目中,并且应该能够从我的mainBundle中播放,对吧?

使用以下代码:

 NSURL *urlString = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"introvideo" ofType:@"mp4"]]; 
MPMoviePlayerController *player  = [[MPMoviePlayerController alloc] initWithContentURL:urlString];
[player play];

我收到了这个错误信息:* Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '* -[NSURL initFileURLWithPath:]: nil string parameter'

希望能得到任何的帮助!


首先,我的问题是主包中没有introvideo.mp4文件。其次,我需要将我的播放器对象设为全局变量 - 这使得视频播放正常。感谢大家的建议! - PinkFloydRocks
7个回答

63

这意味着你的代码找不到introvideo.mp4文件。确保你已经成功地将该文件添加到你的bundle中。你可以在项目设置中检查:复制Bundle资源。 输入图像描述


谢谢您的回答 - 我在哪里找到"Copy Bundle Resource"?是一个复选框吗?这以前对我来说从未成为问题,所以现在突然出现有点奇怪。 - PinkFloydRocks
谢谢 - 手动将视频添加到捆绑包中确实修复了崩溃问题! - PinkFloydRocks
太棒了...非常感谢。 - Hardik Darji

4

Xcode 9

这是一张更新后的图片。

前往Build Phases > Copy Bundle Resources查看你的文件是否在其中。如果没有,您可以通过按“+”按钮添加它。

enter image description here


4

你的代码不正确,请按照以下方式进行更改。仍然将视频复制到捆绑资源中。

NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle]
                                     pathForResource:@"MacBook Pro with Retina Display" ofType:@"m4v"]];
MPMoviePlayerViewController *playercontroller = [[MPMoviePlayerViewController alloc]
                                                 initWithContentURL:url];
[self presentMoviePlayerViewControllerAnimated:playercontroller];
playercontroller.moviePlayer.movieSourceType = MPMovieSourceTypeFile;
[playercontroller.moviePlayer play];
[playercontroller release];
playercontroller = nil;
NSLog(@"Video is Playing");

3

您需要检查该视频是否在应用程序的资源包中可用。

正如您所提到的,您会收到此错误消息:* Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '* -[NSURL initFileURLWithPath:]: nil string parameter

这只是表示问题出现在resourcePath中,意味着在Resource Bundle中不存在这样的文件。这就是为什么pathForResource返回nil路径。

您需要重新放置该视频文件并确保该文件存在于资源包中。

然后,您应该按照Rehan发布的代码进行操作。

  NSURL *url = [NSURL URLWithString:[[NSBundle mainBundle] pathForResource:@"video" ofType:@"mov" inDirectory:@""]];

  MPMoviePlayerController *player = [[MPMoviePlayerController alloc] initWithContentURL:url];
  [[player view] setFrame:[self.view bounds]]; // Frame must match parent view
  [self.view addSubview:[player view]];
  [player play];
  [player release];

我希望对你有所帮助。

谢谢。


3

看起来pathForResource:ofType:返回了nil。请检查:

  1. 确保该文件已添加到“复制资源”构建阶段;
  2. 您没有在文件名中犯错误 - 设备上的路径区分大小写。

2
NSURL *url = [NSURL URLWithString:[[NSBundle mainBundle] pathForResource:@"video" ofType:@"mov" inDirectory:@""]];

MPMoviePlayerController *player = [[MPMoviePlayerController alloc] initWithContentURL:url];
[[player view] setFrame:[self.view bounds]]; // Frame must match parent view
[self.view addSubview:[player view]];
[player play];
[player release];

好的,所以资源没有被复制到捆绑包中,在我手动添加文件后崩溃消失了。但是使用您的代码播放文件不会显示视频。它显示全黑的MPMoviePlayerController,没有控制器 - 有任何想法吗? - PinkFloydRocks
请问您使用的是哪个版本的iOS? - rehan

1
我将整个“Sounds”目录放入了项目中,并将其添加到“复制捆绑资源”部分。一开始它工作得很好,但后来开始崩溃。
解决方法是在文件名前加上目录名称。例如,这样做是不起作用的:
SKAction.playSoundFileNamed("crash.caf", waitForCompletion: false)

...但这个确实有效:

SKAction.playSoundFileNamed("Sounds/crash.caf", waitForCompletion: false)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接