AVQueuePlayer挫折(缓冲区运行不足处理)



我有一个地狱的时间与AVQueuePlayer。非常简单,我在AVPlayerItems的数组上使用playerItemWithURL:构建,并指向网络上的服务器上的视频资产。

如果我尝试在刺激器中运行这个东西,它会先运行第一个资产,然后开始运行第二个资产,然后死亡。有时它甚至没有通过第一个资产。

现在,我明白sim卡的行为与设备不同,所以我也在设备上尝试了一下,出现了同样的问题。

当我记录道具的各种状态变化时,我看到缓冲耗尽,玩家死亡。对我来说,这似乎有点愚蠢,因为这是一个播放一系列项目的结构……当然,缓冲区可能会耗尽,但为什么它会死掉呢?

是我做错了什么,还是这是它应该表现的?

我已经解决了这个问题,通过观察loaddtimeranges属性,当它改变发送PLAY给玩家。但是这会导致播放时口吃,这也很糟糕。

这是我的代码。谁能告诉我怎么才能做到这一点,而不是回放完全是垃圾?
- (void)viewDidLoad {
    [super viewDidLoad];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handlePlayerItemReachedEnd:) name:AVPlayerItemDidPlayToEndTimeNotification object:self.queuePlayer];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handlePlayerStalled:) name:AVPlayerItemPlaybackStalledNotification object:self.queuePlayer];
    NSString *baseURL = @"http://www.aDomain.com/assets/";
    NSMutableArray *vidItemArray = [[NSMutableArray alloc] initWithCapacity:5];
    for (int i = 1; i <= 5; i++) {
        AVPlayerItem *vid = [AVPlayerItem playerItemWithURL:[NSURL URLWithString:[baseURL stringByAppendingFormat:@"%d.mov", i]]];
        [vid addObserver:self forKeyPath:@"status" options:0 context:nil];
        [vid addObserver:self forKeyPath:@"playbackBufferEmpty" options:0 context:nil];
        [vid addObserver:self forKeyPath:@"loadedTimeRanges" options:0 context:nil];
        [vidItemArray addObject:vid];
    }
    self.queuePlayer = [AVQueuePlayer queuePlayerWithItems:vidItemArray];
    [self.mPlaybackView setPlayer:self.queuePlayer];
}
- (void)handlePlayerItemReachedEnd:(NSNotification *)notification {
    NSLog(@"Clip #%d finished playing", [self.queuePlayer.items indexOfObject:self.queuePlayer.currentItem]);
}
- (void)handlePlayerStalled:(NSNotification *)notification {
    NSLog(@"CLIP STALLED...");
}
- (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"]) {
            switch (item.status) {
                case AVPlayerItemStatusFailed:
                    NSLog(@"player item status failed");
                break;
                case AVPlayerItemStatusReadyToPlay:
                    NSLog(@"player item status is ready to play");
                [self.queuePlayer play];
                break;
                case AVPlayerItemStatusUnknown:
                    NSLog(@"player item status is unknown");
                break;
            }
        }
        else if ([keyPath isEqualToString:@"playbackBufferEmpty"]) {
            if (item.playbackBufferEmpty) {
                NSLog(@"player item playback buffer is empty");
            }
        }
        else if ([keyPath isEqualToString:@"loadedTimeRanges"]) {
            NSLog(@"Loaded time range = %@", item.loadedTimeRanges);
            self.queuePlayer play];
        }
    }
}

一开始不应该将许多AVPlayerItem添加到AVQueuePlayer,因为它们将同时开始缓冲,这取决于框架。

尝试加载一个文件,然后在KVO currentItem上更改队列下一个,它可能解决您的问题。我用它来实现无间隙播放

最新更新