1

アプリの info.plist で必要なバックグラウンド モードに App Plays Audio を設定して、バックグラウンドに移行した後に mpmovieplayerviewcontroller が閉じないようにしました。それは素晴らしい仕事をしました。しかし、私がその属性を設定したため、Apple は最近、私のアプリの更新を拒否しました。

次に、同じ仕事をするための解決策を見つけ続けますが、失敗します。それに対処するために、View Controller が UIApplicationDidEnterBackgroundNotification を受け取ったときに currentplaybacktime を保存します。

-(void)willEnterBackground {
    NSLog(@"willEnterBackground");
    if (self.mp) {
        playbackTime = self.mp.moviePlayer.currentPlaybackTime;
        [self.mp dismissModalViewControllerAnimated:YES];
    }
}

そして、UIApplicationWillEnterForegroundNotification を受け取った後に currentPlayBackTime を設定します。

- (void)willEnterForeground {
    NSLog(@"willEnterForeground");

    if (!self.mp)
        return;
    if(self.mp.moviePlayer.playbackState == MPMoviePlaybackStateInterrupted || self.mp.moviePlayer.playbackState == MPMoviePlaybackStateStopped || self.mp.moviePlayer.playbackState == MPMoviePlaybackStatePaused)
    {
        [self continuePlayback];
    }
}

- (void)continuePlayback {
    NSLog(@"%f", self.mp.moviePlayer.duration);
    NSLog(@"%f", playbackTime);
    [self.mp.moviePlayer stop];
    self.mp = [[MPMoviePlayerViewController alloc] initWithContentURL:[NSURL URLWithString:[self.videos objectForKey:@"medium"]]] ;
    [self.mp.moviePlayer setInitialPlaybackTime:playbackTime];
    [self.mp.moviePlayer play];
    [self presentModalViewController:self.mp animated:YES];
}

動作しますが、いくつかのトレードオフがあります。再初期化すると、ストリーミングされたビデオの部分が失われました。ユーザーは再びストリーミングを待つ必要があります。

そして、ここに私の質問があります:

  1. アプリがバックグラウンドのときに Youtube のビデオをストリーミングし続ける方法はありますか?
  2. またはストリーミングされた部分を保持する方法は?

行をスキップすると、ビデオの最初から再生されます。

self.mp = [[MPMoviePlayerViewController alloc] initWithContentURL:[NSURL URLWithString:[self.videos objectForKey:@"medium"]]] ;

continuePlayBack メソッドで、または setInitPlayBackTime の代わりに CurrentPlayBackTime を設定します。

4

1 に答える 1

3

そこで発見したことは完全に正常です - 奇妙ですが、正常です。新しいインスタンスで使用されている場合にMPMoviePlayerControllerのみ尊重されます。initialPlaybackTimeこの問題は古くから (iOS3) 知られていますが、修正されていないため、バグレポートを提出することをお勧めします。

バッファの状態を維持する方法はありません。作成したソリューションは、私が多くのアプリで使用しているものとほとんど同じです。


今すぐあなたの質問に直接答えます。

1) はい、いいえ。ご存じのように、Apple はUIBackgroundModes使用法に対して非常に厳しい態度をとっていました。中断のない AirPlay ストリーミング (ビデオおよびオーディオ コンテンツ) を実現するために使用することを明確に推奨していますが、ビデオを再生するだけの場合はアプリを拒否します。また、Apple のレビュー チーム側の壮大な失敗も考えています。彼ら自身のドキュメントを引用して、彼らの拒絶と戦おうとするかもしれません:

重要: UIBackgroundModes オーディオ キーを使用すると、アプリは AirPlay を使用してオーディオまたはビデオ コンテンツをバックグラウンドでストリーミングできます。

から: http://developer.apple.com/library/ios/#qa/qa1668/_index.html

2) いいえ (導入回答テキストを参照)


また、別の側面から問題に取り組みましょう...

問題が実際にiOS5でAirPlay経由のストリーミング中にデバイスがスリープモードになるという事実である場合。次に、実際には少なくとも機能する可能性のある回避策が1つあります-それは地獄のように厄介ですが...

フックされたメソッド内で登録しMPMoviePlayerIsAirPlayVideoActiveDidChangeNotificationて確認 できます。AirPlay がアクティブになったら、[AirPlay が非アクティブになったら逆にすることを忘れないでください] をairPlayVideoActive設定してアイドリングを防止します。[UIApplication sharedApplication].idleTimerDisabled = YES;AirPlay がアクティブな間、iOS6 でアイドリングの問題が修正されたため、これらはすべて iOS5 でのみ必要です。

于 2013-03-14T20:53:35.777 に答える