MPMoviewPlayerViewController
がUIView
オブジェクトに埋め込まれています。埋め込みモードでプレーヤーを起動すると、すべてが期待どおりに正常に動作します。その後、ユーザーが全画面表示の切り替えをタップした場合(またはsetFullscreen:animated
を使用してプログラムで全画面表示に変更した場合)、プレーヤーが全画面表示になり、映画がさらに1秒間再生された後、画面が「Loading... "メッセージ。
この動作は、iOS 6(iPad 6.0 Simulatorも含む)を使用した場合にのみ発生します。iOS5を実行しているデバイスでは、すべてが意図したとおりに機能します。
映画ソースは、App Bundleのローカルファイルです。
フルスクリーンを再生して入力すると、デバッグ出力は次のようになります。
2012-09-26 15:24:48.251 [39895:c07] [MPAVController] Autoplay:Disable autoplay for pause 2012-09-26 15:24:48.252 [39895:c07] [ MPAVController]自動再生:自動再生を無効にする 2012-09-26 15:24:48.262 [39895:c07] [MPAVController]自動再生:自動再生を有効にする 2012-09-26 15:24:48.265 [39895 :c07] [MPAVController]自動再生:バッファを維持またはフルにする可能性が高い:0 2012-09-26 15:24:48.266 [39895:c07] [MPAVController]自動再生:自動再生をスキップします。保持するのに十分なバッファがありませんup。 2012-09-26 15:24:48.267 [39895:c07] [MPAVController]自動再生:継続する可能性が高い、またはバッファがいっぱいである:0 2012-09-26 15:24: 48.268 [39895:c07] [MPAVController]自動再生:自動再生をスキップしますが、十分なバッファがありません。 2012-09-26 15:24:48.276 [39895:c07] [MPAVController]自動再生:自動再生をスキップし、無効にします(現在のアイテムの場合:0、プレーヤーの場合:1) 2012-09-26 15:24:48.286 [39895:c07] [MPCloudAssetDownloadController]メディアアイテムIDの優先順位付けが要求されました:0 2012- 0 9-26 15:24:48.938 [39895:c07] [MPAVController]自動再生:自動再生を有効にする 2012-09-26 15:24:48.940 [39895:c07] [MPAVController]自動再生:自動再生を有効にする 2012-09-26 15:24:48.954 [39895:c07] [MPAVController] Autoplay:Skipping autoplay、disabled(for current item:0、on player:1) 2012-09-26 15: 24:49.006 [39895:c07] [MPAVController]自動再生:自動再生を有効にする 2012-09-26 15:24:49.012 [39895:c07] [MPAVController]自動再生:自動再生をスキップ、無効(現在のアイテムの場合:0) 、プレーヤー上:1)
プレーヤーがなぜ動作を停止するのか誰か誰かが考えていますか?
編集:githubのサンプルプロジェクト を追加しました
自分で解決しました。 Movie Playerをサブビューとしてコンテナービューに追加するとき、MPMoviePlayerViewController
で作成された実際のビューコントローラーを使用する必要はありません。
Movie Playerビューをサブビューとして他のビューに追加できる単一の目的には、MPMoviePlayerController
のビュープロパティで十分です。
IOS 6までは両方とも機能しましたが、iOS 6はリソース管理/ライフタイムの点で異なるようです。
サンプルプロジェクトは、作業コードで更新されています。
viewWillDisappear:
またはviewDidDisappear:
で動画を停止しますか?これらのメソッドは、ビデオがiOS 6でフルスクリーンに入るときに呼び出されますが、以前のiOSバージョンでは呼び出されません(この「バグ」のOpen Radarで レポートが提出されました )。私は同様の質問に この一時的な解決策 を投稿しました:
バグが修正されるまでの一時的な解決策は、viewWillDisappear:
またはviewDidDisappear:
内のプレーヤーのfullscreen
ブール値を確認することです。 YES
が返された場合、映画は全画面モードになっているため、中断する可能性のある操作は行わないでください。
この問題を別の方法で解決しました。問題の主な理由は、iOS 6がviewWillDisappear:および/またはviewDidDisappear:メソッドを呼び出すためです。 iOSもMPMoviePlayerViewControllerと同じメソッドを呼び出しているのではないかと思いました。そこで、MPMoviePlayerViewControllerのカテゴリを作成し、viewWillDisappear:および/またはviewDidDisappear:メソッドを実装しました。興味深いことに、それは機能します。 (ちなみに、これはアップルでは推奨されていません)
ここにコードがあります。
ヘッダー(MPMoviePlayerViewController_FullscreenFix.h)
#import <MediaPlayer/MediaPlayer.h>
@interface MPMoviePlayerViewController (MPMoviePlayerViewController_FullscreenFix)
- (void)viewDidDisappear:(BOOL)animated;
- (void)viewWillDisappear:(BOOL)animated;
@end
実装(MPMoviePlayerViewController_FullscreenFix.m)
#import "MPMoviePlayerViewController_FullscreenFix.h"
@implementation MPMoviePlayerViewController (MPMoviePlayerViewController_FullscreenFix)
-(void)viewDidDisappear:(BOOL)animated
{
[super viewDidDisappear:animated];
}
- (void)viewWillDisappear:(BOOL)animated{
[super viewWillDisappear:animated];
}
@end
現在、私のコードはiOS 6.1.3、5.5.1、4.3.5の両方のバージョンでまったく同じ動作で動作しています。
私は同じ問題を抱えていましたが、(ウェブ上の)URLからビデオをロードしました
以前は:
MPMoviePlayerPlaybackDidFinishNotification
通知の購読MPMoviePlayerViewController
を初期化しました(この段階ではコンテンツURLはありません)presentMoviePlayerViewControllerAnimated
で提示:MPMoviePlayerViewController
'moviePlayerにコンテンツURLを設定しますあなたが言ったように、ユーザーがexitをタップしたときにMPMoviePlayerViewController
がスタックし、それ自体を閉じないことがあります。これを修正するために、自動再生の順序を変更したので、フローは次のようになります。
MPMoviePlayerPlaybackDidFinishNotification
通知の購読MPMoviePlayerViewController
を初期化しました(この段階ではコンテンツURLはありません)shouldAutoplay
ブール値をNOに設定presentMoviePlayerViewControllerAnimated
で提示:MPMoviePlayerViewController
'moviePlayerにコンテンツURLを設定しますshouldAutoplay
ブール値をYESに設定これらの2つの変更以来、私はまだコントローラーがstuckを取得するのを見ていません
だから私にとってこの解決策はうまくいきました:
if( !( player.playbackState == MPMoviePlaybackStatePlaying ) ) {
player.shouldAutoplay = YES;
[player prepareToPlay];
[player stop];
[player play];
}
「shouldAutoplay」と「stop」の両方を追加する
よろしく、Eliza
プレーヤーのコンテンツURLを設定した後、正確なURLを確認してください。不正な文字が含まれている可能性があります。
NSLog(@"%@", player.contentURL);
シミュレータはスペースを削除しますが、デバイスは削除しません。それが私に起こったことです。
解決策は、MPMoviePlayerControllerクラスを保持するプロパティを作成することです
@property (nonatomic, retain) MPMoviePlayerController *moviePlayerController;
コントローラでプロパティを使用します
self.moviePlayerController = [[MPMoviePlayerController alloc] init];
[_viewMediaPlayer addSubview:self.moviePlayerController.view];
iOS6にバグがあり、フルスクリーンモードでエントリするとMPMoviePlayerControllerの割り当てが解除されます http://openradar.appspot.com/12327997
IOS 6でも似たようなものでした。
全画面表示にした後でプレーヤーに強制的に再生を試みましたか?たとえば[MPMoviePlayerController play]
をもう一度呼び出すことで、これにより、私が抱えていた問題が部分的に解決しました。
URLを生成した後、shouldAutoplayブール値をYESに追加するだけです。
このような:
NSString *path = [[NSBundle mainBundle] pathForResource:videoFileName ofType:@"mp4" inDirectory:nil];
NSURL *movieURL = [NSURL fileURLWithPath:path];
MPMoviePlayerController *player = [[MPMoviePlayerController alloc] init];
player.contentURL = movieURL;
player.controlStyle = MPMovieControlStyleNone;
player.shouldAutoplay = YES;
[player prepareToPlay];
player.fullscreen = YES;
[player.view setFrame:[[[[UIApplication sharedApplication] delegate] window] frame]]; // player's frame must match parent's
[[[[UIApplication sharedApplication] delegate] window] addSubview: player.view];
[player play];
マイワーキングソリューション:
同じ問題がありましたが、ビデオを再生しようとすると、1秒後にログで停止します。
[MPCloudAssetDownloadController] Prioritization requested for media item ID: 0
[MPAVController] Autoplay: Skipping autoplay, disabled (for current item: 0, on player: 1)
私は解決済みそれを入れてstopコマンドを直前にplayコマンド:
[playerController stop];
[playerController play];
今では完璧に動作します!
これに対処する別の方法は、全画面通知コールバックを使用することです:
1)ムービープレーヤーMPMoviePlayerDidEnterFullscreenNotificationの通知を追加します。 2)ムービーを再生する前に、ムービーがフルスクリーンになることを示すブール値を設定します。 3)フルスクリーンコールバックとムービーのコールバックでブール値をNOにクリアします。 4)viewWillDisappearで、ブール値が映画を全画面表示にしているかどうかを確認し、必要に応じて処理します。
また、MPMoviePlayerViewControllerを提示する場合、提示後にsetFullScreen関数を使用すると、iOS6でムービーが停止する可能性があります。