1

AVQueuePlayer を使用して、バックグラウンドでいくつかのアイテムを再生しました。コードは iOS4 で完璧に機能しました。また、iOS5 では AVQueuePlayer の動作が変更されたため、最初の項目が終了するとプレーヤーの再生が停止します。

Matt Gallagher がこの投稿でヒントを書いています。「iOS 5 の時点で、AVQueuePlayer はプリバッファリングを行わなくなったようです。iOS 4 では次のトラックをプリバッファリングしました。」

だから私の質問は、iOS5 で AVPlayer または AVQueuePlayer を使用してバックグラウンドで複数のアイテムを再生する方法です。

4

1 に答える 1

1

Matt Gallagher のブログでの回答: 「AVQueuePlayer の現在の項目を監視する必要があります。項目が変更されたら、UIApplication を使用して backgroundTask を開始し、次のファイルの再生準備完了通知を受け取ったときにのみバックグラウンド タスクを終了する必要があります。」

実際、これは私を助けませんでした。

だから私の解決策は次のとおりです。

[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];

理由は説明できませんが、新しい AVPlayerItem を追加する前にこのコード行を追加すると、コードが機能しました。バックグラウンドで次のトラックを追加してメソッドを使用する人にも

- (void)loadValuesAsynchronouslyForKeys:(NSArray *)keys completionHandler:(void (^)(void))handler;

メイン スレッドでプレーヤーに AVPlayerItem を追加する必要があります。このような:

- (void)addAsset:(AVAsset*)as
{
    [player insertItem:[AVPlayerItem playerItemWithAsset:as] afterItem:[player currentItem]];
}

.........

//adding new track 

AVURLAsset* as = [[self createAsset:urlString] retain];
NSArray *keys = [NSArray arrayWithObject:@"tracks"];
[as loadValuesAsynchronouslyForKeys:keys completionHandler:^(void) {
NSError *error = 
AVKeyValueStatus trackStatus = [as statusOfValueForKey:@"tracks" error:&error];
switch (trackStatus) {
    case AVKeyValueStatusLoaded:
            [self performSelectorOnMainThread:@selector(addAsset:) withObject:as waitUntilDone:YES];
            [as release];
    break;
    case AVKeyValueStatusFailed:
            [as release];
    break;
    case AVKeyValueStatusCancelled:
            [as release];
    break;
    default:
    break;
    }

}];

更新: Matt Gallagher は正しかったですが、非同期読み込みを使用しない場合にのみ機能します。

于 2011-11-21T17:28:36.993 に答える