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 は正しかったですが、非同期読み込みを使用しない場合にのみ機能します。