【问题标题】:Video playback fails - [NSURL initFileURLWithPath:]: nil string parameter视频播放失败 - [NSURL initFileURLWithPath:]: nil string parameter
【发布时间】:2013-01-06 02:28:20
【问题描述】:

我很难理解为什么这不起作用:/ 每次我运行项目时,应用程序都会崩溃并抛出“NSInvalidArgumentException”,原因:'* -[NSURL initFileURLWithPath:]:零字符串参数'

我遵循了一个教程(我对此很陌生),它对他有用,代码完全相同..谁能解释发生了什么?

.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

【问题讨论】:

  • 在有人问起 Reece Darragh 拥有我们正在使用的开发帐户之前。感谢您的帮助

标签: iphone ios video ios6


【解决方案1】:

唯一重要的部分是:

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

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

检查:

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

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

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

【讨论】:

  • 感谢您的回复。不幸的是,它仍然没有启动,我确定了你推荐的一切。 intro.mp4 现在肯定在捆绑包中?我很困惑为什么它没有启动
  • 还要检查您的名称拼写是否正确(包括大小写——您确定它是 MP4 而不是 mp4?)。您可能还想在磁盘上查看您构建的应用程序的内部,看看文件是否在它应该在的位置。
  • 我检查了 .app 文件,视频在主文件夹中应该在哪里?还尝试在 MP4 上更改大小写,但这显然没有任何区别:(
  • 当我在构建阶段添加视频文件时,嘿,工作完美..谢谢
【解决方案2】:

库尔特的回答特别适合我

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

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

我本来想对 Kurt 的帖子发表评论,但不知道该怎么做。我投了赞成票。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

          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"
          

          一切正常。

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

          【讨论】:

            猜你喜欢
            • 2011-07-01
            • 1970-01-01
            • 2022-07-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-03-14
            • 2014-04-28
            • 1970-01-01
            相关资源
            最近更新 更多