私はまったく同じ問題を抱えていて、これに10時間を無駄にしました...
しかし、メインスレッドに「insertItem」メソッドを追加することで修正されました。
だから私は自分のプレーヤーをプロパティとして持っています:
@property AVQueuePlayer * player;
私はこのようにそれを初期化します:
_player = [[AVQueuePlayer alloc] init];
そして、これがパスからアイテムを追加する私の方法です:
- (void)addInQueuePlayerFile:(NSString *)path {
AVAsset * asset = [AVAsset assetWithURL:[[NSURL alloc] initFileURLWithPath:path]];
AVPlayerItem * playerItem = [AVPlayerItem playerItemWithAsset:asset];
dispatch_async(dispatch_get_main_queue(), ^{
[_player insertItem:playerItem afterItem:nil];
});
}
それでうまくいきましたが、その理由がよくわかりません...誰かが答えを持っていれば...
しかし、これがうまくいかない場合は、プレイヤー (および/または playerItem) にオブザーバーを追加してみてください。次のようなオブザーバーを追加できます。
[_player addObserver:self forKeyPath:@"status" options:0 context:nil]
そして、このメソッドでそれをキャッチします:
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
if (object == _player && [keyPath isEqualToString:@"status"]) {
if (_player.status == AVPlayerStatusFailed) {
NSLog(@"AVPlayer Failed");
} else if (_player.status == AVPlayerStatusReadyToPlay) {
NSLog(@"AVPlayer item Ready to Play");
} else if (_player.status == AVPlayerStatusUnknown) {
NSLog(@"AVPlayer item Unknown");
}
}
}
これがうまくいくかどうか教えてください。