ユーザーがボタンを押したときに MPMoviePlayerController を使用して既存のビューにムービー ビューを追加し、iOS アプリの場所でビデオを再生しようとしています。ビューは正しい位置とすべてにブラック ボックスとして表示されますが、何も起こりません。映画の再生が始まることを期待していますが、何も起こらず、アプリケーションから理由に関するヒントもありません。
これがどこでうまくいかないか誰にもわかりますか?
-(IBAction) playButtonClicked:(id)sender
{
NSString* path = [[NSBundle mainBundle] pathForResource:@"sample_mpeg4" ofType:@"mp4"];
NSLog(@"Using videoPath %@", path);
NSURL* url = [NSURL fileURLWithPath:path];
MPMoviePlayerController *player = [[MPMoviePlayerController alloc] initWithContentURL:url];
[self.view addSubview:player.view];
player.view.frame = CGRectMake(10, 10, 300, 220);
[player play];
}
ムービーは存在し、正しいパスをログに記録しますが、まだムービーが再生されません。
2012-07-06 11:51:13.492 experiments[84702:12203] Using videoPath /Users/marius/Library/Application Support/iPhone Simulator/5.1/Applications/9799C851-8D2B-4CFE-8CFA-A4C4C954787F/experiments.app/sample_mpeg4.mp4
私が読んで理解したことから、これはうまくいくはずです。何を試すべきかについてのヒントや提案はありますか?
ムービーを HTTP サーバー (fg.mp4) に移動し、アクセス ログを追跡しています。再生ボタンをクリックすると、通常の黒いウィンドウが表示されます。サーバー側で、ログに次の 2 つの新しいエントリが見つかりました。
168.122.x.x - - [06/Jul/2012:22:42:33 +0200] "GET /fg.mp4 HTTP/1.1" 304 192 "-" "AppleCoreMedia/1.0.0.9B176 (iPhone Simulator; U; CPU OS 5_1 like Mac OS X; en_us)"
168.122.x.x - - [06/Jul/2012:22:42:33 +0200] "GET /fg.mp4 HTTP/1.1" 206 33304 "-" "AppleCoreMedia/1.0.0.9B176 (iPhone Simulator; U; CPU OS 5_1 like Mac OS X; en_us)"
そのため、電話は映画コンテンツの一部を取得し、必要に応じて残りを取得する準備をしているようです。不足している MPMoviePlayerController の明らかなパラメーターはありますか?
更新: ソリューションと作業コード
この問題は、ARC と、MPMoviePlayerController
コントローラーを設定するメソッドを呼び出した後に への参照が保持されていないことが原因で発生します。解決策: クラスにクラス変数を追加し、これを使用して、ムービーの有効期間中、コントローラーへの参照を保持します。
クラス宣言の早い段階で(メッセージ/関数定義の外で):
MPMoviePlayerController* mpController;
そして、上記playButtonClicked
はこの変数を使用してコントローラーを追跡します。
NSString* path = [[NSBundle mainBundle] pathForResource:@"sample_mpeg4" ofType:@"mp4"];
NSURL* url = [NSURL fileURLWithPath:path];
mpController = [[MPMoviePlayerController alloc] initWithContentURL:url];
mpController.view.frame = CGRectMake(10, 10, 300, 220);
[self.view addSubview:mpController.view];
[mpController play];