s3バケット上のエンコードされたビデオのセットからAVQeueueプレーヤーを構築し、AVPlayerActionAtItemEndAdvanceを使用してビデオを順番に再生しています。
- ビデオはすべて同じ解像度とコーデックでエンコードされます
- それらはすべてプレイするのに良いテストがされています
- 一部のデバイスでは、以下のこのソリューションが正常に機能します
- 以下の問題は、IOS5.xと6.xの両方で発生します。
- メインスレッドで行われたすべてをチェックしようとしています。(おそらく問題)
問題:シミュレーターおよび一部のデバイス(4秒および5秒で通知)で、x個のビデオ(xは予測できない場合がありますが、通常は3、4)の後、ビデオは音声のみで再生され、キューを強制終了し、「playerItemDidReachEnd」をスローしません" お知らせ。アプリがクラッシュしたりフリーズしたりすることはありません。「AVPlayerItemStatusFailed」または「AVPlayerItemStatusUnknown」からエラーは受信されません
誰かがこの問題の経験があるなら、共有してください。
コード:-(void)addObservers {
dispatch_async(dispatch_get_main_queue(),
^{
for(int i = 0; i < [self.videodata count]; i++) {
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(playerItemDidReachEnd:)
name:AVPlayerItemDidPlayToEndTimeNotification
object:[self.videodata objectAtIndex:i]];
[[self.videodata objectAtIndex:i] addObserver:self forKeyPath:@"status" options:NSKeyValueObservingOptionNew context:nil];
[[self.videodata objectAtIndex:i] addObserver:self forKeyPath:@"playbackBufferEmpty" options:NSKeyValueObservingOptionNew context:nil];
[[self.videodata objectAtIndex:i] addObserver:self forKeyPath:@"playbackLikelyToKeepUp" options:NSKeyValueObservingOptionNew context:nil];
}
});
}
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *) change context:(void *)context
{
if ([object isKindOfClass:[AVPlayerItem class]])
{
AVPlayerItem *item = (AVPlayerItem *)object;
if ([keyPath isEqualToString:@"status"])
{ //yes->check it...
switch(item.status)
{
case AVPlayerItemStatusFailed:
{
[TestFlight passCheckpoint:@"AV FAILED"];
NSError *error = [item error];
NSLog(@"playback error is %@", error);
break;
}
case AVPlayerItemStatusReadyToPlay:
NSLog(@"player item status is ready to play");
break;
case AVPlayerItemStatusUnknown:
{
[TestFlight passCheckpoint:@"AV STATUS UNKNOWN"];
break;
}
}
}
else if (item == [self.queuePlayer currentItem] && [keyPath isEqualToString:@"playbackBufferEmpty"])
{
if (item.playbackBufferEmpty)
{
[loadingView show:YES];
}
}
else if(item == [self.queuePlayer currentItem] && [keyPath isEqualToString:@"playbackLikelyToKeepUp"])
{
[self.queuePlayer play];
[loadingView hide:YES];
}
}
}
- (void)playerItemDidReachEnd:(NSNotification *)notification {
NSLog(@"ended video %i " , (int)self.currentItem);
AVPlayerItem *p = [notification object];
[p seekToTime:kCMTimeZero];
}