8

我很难理解为什么这不起作用:/每次我运行项目时,应用程序都会崩溃,给我一个 'NSInvalidArgumentException',原因:' * -[NSURL initFileURLWithPath:]: nil string parameter'

我遵循了一个教程(我对此很陌生),它对他有用,代码完全一样。任何人都可以解释发生了什么吗?

.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
4

6 回答 6

34

所有这一切中唯一重要的部分是:

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

我假设异常是在第二行内引发的。这意味着它stringPath为零,如果文件intro.MP4实际上不在您的应用程序包中,就会发生这种情况。

检查:

  • 该文件存在于您的源代码副本中

  • 您的 Xcode 项目有对该文件的引用(如果它是红色的,则表示该文件实际上并不存在)

  • 在 Xcode 的目标中,查看“Build Phases”并显示“Copy Bundle Resources”构建阶段。该文件应该存在。如果不是,请按 + 按钮并选择它。

于 2013-01-06T04:08:40.943 回答
6

库尔特的回答特别适合我

“在 Xcode 的目标中,查看“构建阶段”并显示“复制捆绑资源”构建阶段。该文件应该存在。如果不存在,请按 + 按钮并选择它。

我的电影文件丢失了。它以前一定在那里,因为它正在工作,然后它就停止了。

我本来会对库尔特的帖子发表评论,但不知道怎么做。我做了“赞成票”。

于 2013-02-08T04:35:08.650 回答
1

确保在 Copy Bundle Resources 中添加您尝试播放的音频文件。

  1. 单击 Xcode 项目图标(左侧项目导航器中的第一个)
  2. 点击目标
  3. 点击构建阶段
  4. 转到复制捆绑资源
  5. 检查您的音频文件是否在列表中可用。
  6. 如果未添加,请通过点击+图标添加它们
  7. 构建并运行
于 2020-07-07T17:06:22.640 回答
0

你的视频太长了。使用此代码,限制为 30 秒。您最好的选择是从 url 流式传输它。尝试播放短于 30 秒的视频,它会正常工作。

于 2014-10-20T04:33:19.313 回答
0

除了这个答案https://stackoverflow.com/a/14179186/3213411中提到的内容之外,您还需要确保您引用的文件在构建目标中具有成员资格。您可以在文件检查器中指定它。这个答案解释了如何https://stackoverflow.com/a/5300901/3213411

于 2014-01-20T00:49:22.293 回答
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"

一切正常。

希望这对某人有所帮助!干杯。

于 2016-01-13T00:00:00.390 回答