1

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];

    }
4

0 に答える 0