26

オブジェクトにMPMoviewPlayerViewController埋め込まれていUIViewます。組み込みモードでプレーヤーを起動すると、すべて正常に動作し、期待どおりに動作します。ユーザーがフルスクリーンのトグルをタップすると (または を使用してプログラムでフルスクリーンに変更するとsetFullscreen:animated)、プレーヤーがフルスクリーンになり、ムービーがさらに 1 秒間再生された後、画面が真っ暗になり、" Loading... " メッセージだけが表示されます。

この動作は、iOS 6 (iPad 6.0 シミュレーターも) を使用した場合にのみ発生し、iOS 5 を実行しているデバイスではすべてが意図したとおりに機能します。

ムービー ソースは、アプリ バンドルのローカル ファイルです。

再生してフルスクリーンに入ると、デバッグ出力は次のようになります。

2012-09-26 15:24:48.251 [39895:c07] [MPAVController] 自動再生: 一時停止の自動再生を無効にする
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] 自動再生: 自動再生をスキップしています。追いつくのに十分なバッファがありません。
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-09-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] 自動再生: 自動再生のスキップ、無効化 (現在のアイテム: 0、プレイヤー: 1)
2012-09-26 15:24:49.006 [39895:c07] [MPAVController] 自動再生: 自動再生を有効にする
2012-09-26 15:24:49.012 [39895:c07] [MPAVController] 自動再生: 自動再生のスキップ、無効化 (現在のアイテム: 0、プレイヤー: 1)

プレーヤーが機能しなくなった理由を知っている人はいますか?

編集:github にサンプルプロジェクトを追加

4

11 に答える 11

45

またはでビデオを停止していますviewWillDisappear:viewDidDisappear:? これらのメソッドは、ビデオが iOS 6 で全画面表示になったときに呼び出されますが、以前の iOS バージョンでは呼び出されません (この「バグ」について Open Radar にレポートが提出されています)。この一時的な解決策を同様の質問に投稿しました:

バグが修正されるまでの一時的な解決策は、および/またはでプレーヤーのfullscreenブール値を確認することです。が返された場合、ムービーはフルスクリーン モードに入っているため、それを妨げる可能性のある操作を控える必要があります。viewWillDisappear:viewDidDisappear:YES

于 2012-09-26T19:34:11.133 に答える
8

私は別のアプローチでこの問題を解決しました。問題の主な理由はiOS6が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の両方のバージョンで動作し、まったく同じ動作をします。

于 2013-03-23T20:26:29.403 に答える
3

自分で解決しました。MPMoviePlayerViewControllerコンテナビューにサブビューとしてムービープレーヤーを追加するので、モーダルまたは他のvc階層で表示するために使用することを目的として作成された実際のビューコントローラーを使用する必要はありません。

他のビューにサブビューとして追加できるMoviePlayerビューを作成するという単一の目的には、MPMoviePlayerController'sviewプロパティで十分です。

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

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

于 2012-09-28T08:52:17.667 に答える
2

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

以前の私:

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

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

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

これらの 2 つの変更以来、コントローラーがスタックするのをまだ見ていません。

于 2012-09-27T03:17:37.580 に答える
1

私はiOS6で似たようなものを持っていました。

フルスクリーンにした後、プレーヤーに強制的にプレイさせようとしましたか?[MPMoviePlayerController play]たとえば、もう一度電話することで、これは私が抱えていた問題を部分的に解決しました。

于 2012-09-26T14:42:23.933 に答える
1

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

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

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

于 2012-10-08T21:40:59.583 に答える
1

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

@property (nonatomic, retain) MPMoviePlayerController *moviePlayerController;

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

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

[_viewMediaPlayer addSubview:self.moviePlayerController.view];

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

于 2013-03-15T19:05:14.153 に答える
0

私の実用的なソリューション:

同じ問題が発生しました。ビデオを再生しようとすると、ログが表示されて1秒後に停止します。

[MPCloudAssetDownloadController] Prioritization requested for media item ID: 0
[MPAVController] Autoplay: Skipping autoplay, disabled (for current item: 0, on player: 1)

再生コマンドの直前に停止コマンドを入れて解決しまし

[playerController stop];
[playerController play];

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

于 2013-03-21T04:54:41.157 に答える
0

URLを生成した後、 shouldAutoplay boolean を 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];
于 2012-09-27T08:08:34.047 に答える
0

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

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

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

于 2012-12-23T12:55:53.267 に答える