web-dev-qa-db-ja.com

iOS:MPMoviePlayerControllerの使用方法

空のプロジェクト(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にあるため、特にわかりません。ビュー階層では、IS。

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];

白い画面とエラーのある同様の結果。助けてください....

30
Zoltán Matók

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

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

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

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

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

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

_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を定義するときに、ファイルにアクセスする場合はNSURLのURLWithStringメソッドを使用しますネットワーク経由を使用し、NSURLのfileUrlWithPathを使用する場合ファイルがあるlocally

89
Zoltán Matók

これを試してみてください......

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];
8

これを試して:

//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.
2
Rakesh Kumar

追加してみてください

[player prepareToPlay];

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

MPMoviePlayerControllerの詳細については、Apple documentation: http://developer.Apple.com/library/ios/#documentation/mediaplayer/reference/MPMoviePlayerController_Class/Reference/Reference。 html#// Apple_ref/doc/c_ref/MPMoviePlayerController

1
Mikhail Viceman