30

空のプロジェクト(iOS)を作成し、これをviewDidLoadに配置しました。

NSString *moviePath = [[NSBundle mainBundle] pathForResource:@"Movie" ofType:@"m4v"];
MPMoviePlayerViewController *playerController = [[MPMoviePlayerViewController alloc] initWithContentURL:[NSURL fileURLWithPath:moviePath]];
[self presentMoviePlayerViewControllerAnimated:playerController];
[playerController.moviePlayer play];

アプリを起動すると、ログにエラーメッセージが表示された白い画面が表示されます

 <Error>: CGContextSaveGState: invalid context 0x0
 <Error>: CGContextClipToRect: invalid context 0x0
 <Error>: CGContextTranslateCTM: invalid context 0x0
 <Error>: CGContextDrawShading: invalid context 0x0
 <Error>: CGContextRestoreGState: invalid context 0x0
Warning: Attempt to present <MPMoviePlayerViewController: 0x821e3b0> on <ViewController: 0x863aa40> whose view is not in the window hierarchy!

...そして自動再生の無効化に関する一連の行。ビューは空白の「シングルビューアプリケーション」iOSプロジェクトであり、コードはViewController.mにあるため、ビューが階層の一部ではないという行は特にわかりません。ビュー階層にあります。

MPMoviePlayerのAppleのサンプルコードから入手したので、ムービーファイル自体は問題ではないという事実を知っています。そして、私は(一見)サンプルに書かれているすべてを試しましたが、プレーヤーを動作させることができませんでした。

これが別の試みです。今回はMPMoviePlayerController(MPMoviePlayerViewControllerではありません)を使用します。

MPMoviePlayerController *player = [[MPMoviePlayerController alloc] initWithContentURL:url];
[player setContentURL:url];
[player setMovieSourceType:MPMovieSourceTypeFile];

[[player view] setFrame:self.view.bounds];
[player view].backgroundColor = [UIColor greenColor];

player.scalingMode = MPMovieScalingModeNone;
player.controlStyle = MPMovieControlModeDefault;
player.backgroundView.backgroundColor = [UIColor whiteColor];
player.repeatMode = MPMovieRepeatModeNone;

[self.view addSubview: [player view]];
[player play];

同様の結果、白い画面とエラーが発生します。助けてください....

4

4 に答える 4

90

私たちがしなければならないのはこれだけです:

NSURL *movieURL = [NSURL URLWithString:@"http://example.com/somefile.mp4"];
movieController = [[MPMoviePlayerViewController alloc] initWithContentURL:movieURL];
[self presentMoviePlayerViewControllerAnimated:movieController];
[movieController.moviePlayer play];
  • movieControllerMPMoviePlayerViewController.hファイルで宣言されたのインスタンスです。

  • 重要:URLを定義するときにURLWithString、ネットワーク経由でファイルにアクセスする場合はNSURLのメソッドを使用しfileUrlWithPath、ファイルがローカルにある場合はNSURLのメソッドを使用してください。

  • [movieController.moviePlayer play] は必須ではなく、自動再生をNOに設定していなくてもプレーヤーは起動しますが、これを入力playすると少し速く起動することがわかりました。これは単なる偶然かもしれません。

  • ユーザーが完了ボタンをタップしたとき(プレーヤーは自動的に閉じられます)を知りたい場合は、プレーヤーが閉じられたときに表示されるViewController-viewDidAppearで呼び出されることを知っておく必要があります。BOOLプレーヤーの起動時に変数を設定し、プレーヤーが解雇されたために呼び出されたことをBOOL確認できるように、をチェックすることができます。または、通知に登録することもできますが、それではうまくいきませんでした。-viewDidAppear-viewDidAppearMPMoviePlayerDidExitFullScreen

または、これが機能しない場合は、次のようにすることができます

self.moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"something" ofType:@"mp4"]]];
[self.moviePlayer.view setFrame:CGRectMake(0, 0, 320, 320)];
[self.moviePlayer play];
[self.view addSubview:self.moviePlayer.view];
  • self.movi​​eplayerは、MPMoviePlayerControllerのインスタンスです( MPMoviePlayerViewControllerではありません)。私の経験では、単純なivarではなくプロパティ(次のように:)として宣言することが重要です。@property (strong, nonatomic) MPMoviePlayerController *moviePlayer;これは、ivarの場合は機能しない場合があるためです。

  • フレームを設定することも重要です。設定しないと、ビデオがまったく表示されないためです。フレームは、定義したものがビューの範囲内にある限り、何でもかまいません。

  • 重要:上記のように、URLを定義するときに、ネットワーク経由でURLWithStringファイルにアクセスする場合はNSURLのメソッドを使用し、ファイルがローカルにある場合はNSURLのメソッドを使用します。fileUrlWithPath

于 2012-10-18T09:06:21.253 に答える
8

あなたはこれを試さなければなりません......

NSString *path = [[NSBundle mainBundle]pathForResource:@"test" ofType:@"mp4"];
    player = [[MPMoviePlayerViewController alloc]initWithContentURL:[NSURL fileURLWithPath:path]];
    [player.view setFrame:CGRectMake(0, 0, 320, 320)];
    [self presentMoviePlayerViewControllerAnimated:player];
    [player.moviePlayer play];
     [self.view addSubview:player.view];
于 2014-05-29T06:51:56.483 に答える
2

これを試して:

//Hello guise :- complete process here.

//1. add framework in .h 
MediaPlayer/MediaPlayer.h

//2.add delegate in @interface, MPMediaPickerControllerDelegate

//3.@property (retain, nonatomic) MPMoviePlayerViewController *moviePlayerController;

//4.and synthesize in .m - @synthesize moviePlayerController;

//5.IN - tableViewdelegateMethod

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath: (NSIndexPath *)indexPath{    

    //given path for song
    NSArray *paths1 = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory1 = [paths1 objectAtIndex:0];
    NSString *strPath = [NSString stringWithFormat:@"%@/%@",documentsDirectory1,[movieArray objectAtIndex:indexPath.row]];
    NSLog(@"strPath %@",strPath);
    //path for song.
    //convert path in NSURL.
    NSURL *videosURL = [NSURL fileURLWithPath:strPath];
    moviePlayerController = [[MPMoviePlayerViewController alloc]initWithContentURL:videosURL];
    [self presentMoviePlayerViewControllerAnimated:moviePlayerController];
    [moviePlayerController.moviePlayer play];
}

//play song on UITableViewCell click.
于 2014-01-24T12:00:52.990 に答える
1

追加してみてください

[player prepareToPlay];

MPMoviePlayerController *player = [[MPMoviePlayerController alloc] initWithContentURL:url];

MPMoviePlayerControllerの詳細については、Appleのドキュメントを参照してください:http: //developer.apple.com/library/ios/#documentation/mediaplayer/reference/MPMoviePlayerController_Class/Reference/Reference.html#//apple_ref/doc/c_ref/MPMoviePlayerController

于 2012-10-10T15:05:58.113 に答える