web-dev-qa-db-ja.com

mainBundleからMP4ビデオファイルを再生できません

XCodeでプロジェクトにドラッグした簡単なイントロアニメーションビデオファイルを再生しようとしているため、mainBundleから再生できるはずです。

このコードで:

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

次のエラーメッセージが表示されます:*キャッチされない例外 'NSInvalidArgumentException'が原因でアプリを終了しています、理由: '*-[NSURL initFileURLWithPath:]:nil string parameter'

どんな助けでも素晴らしいです!

22
PinkFloydRocks

これは、コードがintrovideo.mp4ファイルを見つけられないことを意味します。そのファイルをバンドルに正常に追加したことを確認してください。プロジェクトの設定でバンドルリソースのコピーを確認できます。 enter image description here

60
sunkehappy

コードが正しくありません。下記に合わせて変更してください。それでも、ビデオをバンドルリソースにコピーします。

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");
4
David Moore

Xcode 9

こちらが更新された画像です。

Build Phases> Copy Bundle Resourcesに移動し、ファイルが存在するかどうかを確認します。そうでない場合は、「+」ボタンを押して追加できます。

enter image description here

3
Suragch

そのビデオがアプリケーションのリソースバンドルで利用可能かどうかを確認する必要があります。

あなたが述べたようにyou getting this error message: * Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '* -[NSURL initFileURLWithPath:]: nil string parameter

それは単に問題がresourcePathにあることを示し、リソースバンドルにそのようなファイルが存在しないことを意味します。そのため、pathForResourcenilパスを返します。

そのビデオファイルを再度配置し、そのファイルがリソースバンドルに存在することを確認する必要があります。

次に、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
Kamar Shad

PathForResource:ofType:はnilを返すようです。それを確認します

  1. このファイルは確かに「リソースのコピー」ビルドフェーズに追加されます。
  2. ファイルの名前を間違えていません-デバイスのパスは大文字と小文字が区別されます。
3
Kreiri
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];
2
rehan

「Sounds」ディレクトリ全体をプロジェクトに配置し、「バンドルリソースのコピー」セクションに追加しました。正常に動作していましたが、その後クラッシュし始めました。

修正は、ファイル名の前にディレクトリ名を付加することでした。たとえば、これはされませんでした機能します:

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

...しかし、これはdid機能です:

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