web-dev-qa-db-ja.com

MPMoviePlayerControllerがiOS6で全画面表示に移行した後、中断/停止する

MPMoviewPlayerViewControllerUIViewオブジェクトに埋め込まれています。埋め込みモードでプレーヤーを起動すると、すべてが期待どおりに正常に動作します。その後、ユーザーが全画面表示の切り替えをタップした場合(または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のサンプルプロジェクト を追加しました

26
snod

自分で解決しました。 Movie Playerをサブビューとしてコンテナービューに追加するとき、MPMoviePlayerViewControllerで作成された実際のビューコントローラーを使用する必要はありません。

Movie Playerビューをサブビューとして他のビューに追加できる単一の目的には、MPMoviePlayerControllerのビュープロパティで十分です。

IOS 6までは両方とも機能しましたが、iOS 6はリソース管理/ライフタイムの点で異なるようです。

サンプルプロジェクトは、作業コードで更新されています。

3
snod

viewWillDisappear:またはviewDidDisappear:で動画を停止しますか?これらのメソッドは、ビデオがiOS 6でフルスクリーンに入るときに呼び出されますが、以前のiOSバージョンでは呼び出されません(この「バグ」のOpen Radarで レポートが提出されました )。私は同様の質問に この一時的な解決策 を投稿しました:

バグが修正されるまでの一時的な解決策は、viewWillDisappear:またはviewDidDisappear:内のプレーヤーのfullscreenブール値を確認することです。 YESが返された場合、映画は全画面モードになっているため、中断する可能性のある操作は行わないでください。

45
Anthony

この問題を別の方法で解決しました。問題の主な理由は、iOS 6がviewWillDisappear:および/またはviewDidDisappear:メソッドを呼び出すためです。 iOSもM​​PMoviePlayerViewControllerと同じメソッドを呼び出しているのではないかと思いました。そこで、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の両方のバージョンでまったく同じ動作で動作しています。

8
Yildiray Meric

私は同じ問題を抱えていましたが、(ウェブ上の)URLからビデオをロードしました

以前は:

  1. MPMoviePlayerPlaybackDidFinishNotification通知の購読
  2. MPMoviePlayerViewControllerを初期化しました(この段階ではコンテンツURLはありません)
  3. presentMoviePlayerViewControllerAnimatedで提示:
  4. 画面に表示されている間に、ストリーミングされたURLを(非同期に)ロードしました
  5. URLが戻ってきたら、MPMoviePlayerViewController 'moviePlayerにコンテンツURLを設定します

あなたが言ったように、ユーザーがexitをタップしたときにMPMoviePlayerViewControllerがスタックし、それ自体を閉じないことがあります。これを修正するために、自動再生の順序を変更したので、フローは次のようになります。

  1. MPMoviePlayerPlaybackDidFinishNotification通知の購読
  2. MPMoviePlayerViewControllerを初期化しました(この段階ではコンテンツURLはありません)
  3. moviePlayerのshouldAutoplayブール値をNOに設定
  4. presentMoviePlayerViewControllerAnimatedで提示:
  5. 画面に表示されている間に、ストリーミングされたURLを(非同期に)ロードしました
  6. URLが戻ってきたら、MPMoviePlayerViewController 'moviePlayerにコンテンツURLを設定します
  7. moviePlayerのshouldAutoplayブール値をYESに設定

これらの2つの変更以来、私はまだコントローラーがstuckを取得するのを見ていません

2
user1702073

だから私にとってこの解決策はうまくいきました:

if( !( player.playbackState == MPMoviePlaybackStatePlaying ) ) {
    player.shouldAutoplay = YES;
    [player prepareToPlay];
    [player stop];
    [player play];
}

「shouldAutoplay」と「stop」の両方を追加する

よろしく、Eliza

1
ElizaS

プレーヤーのコンテンツURLを設定した後、正確なURLを確認してください。不正な文字が含まれている可能性があります。

    NSLog(@"%@", player.contentURL);

シミュレータはスペースを削除しますが、デバイスは削除しません。それが私に起こったことです。

1
nesimtunc

解決策は、MPMoviePlayerControllerクラスを保持するプロパティを作成することです

@property (nonatomic, retain) MPMoviePlayerController *moviePlayerController;

コントローラでプロパティを使用します

self.moviePlayerController = [[MPMoviePlayerController alloc] init];

[_viewMediaPlayer addSubview:self.moviePlayerController.view];

iOS6にバグがあり、フルスクリーンモードでエントリするとMPMoviePlayerControllerの割り当てが解除されます http://openradar.appspot.com/12327997

1
Husky

IOS 6でも似たようなものでした。

全画面表示にした後でプレーヤーに強制的に再生を試みましたか?たとえば[MPMoviePlayerController play]をもう一度呼び出すことで、これにより、私が抱えていた問題が部分的に解決しました。

1
g_fred

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];
0
Harsh Mehrotra

マイワーキングソリューション:

同じ問題がありましたが、ビデオを再生しようとすると、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];

今では完璧に動作します!

0
Almas Adilbek

これに対処する別の方法は、全画面通知コールバックを使用することです:

1)ムービープレーヤーMPMoviePlayerDidEnterFullscreenNotificationの通知を追加します。 2)ムービーを再生する前に、ムービーがフルスクリーンになることを示すブール値を設定します。 3)フルスクリーンコールバックとムービーのコールバックでブール値をNOにクリアします。 4)viewWillDisappearで、ブール値が映画を全画面表示にしているかどうかを確認し、必要に応じて処理します。

また、MPMoviePlayerViewControllerを提示する場合、提示後にsetFullScreen関数を使用すると、iOS6でムービーが停止する可能性があります。

0
Edward