gpt4 book ai didi

ios6 - AVQueuePlayer 挫败感(缓冲区欠载处理)

转载 作者:行者123 更新时间:2023-12-01 11:47:55 24 4
gpt4 key购买 nike

我在 AVQueuePlayer 上玩得很开心。非常简单,我在使用 playerItemWithURL: 构建的一系列 AVPlayerItems 上创建它,并指向网络上服务器上的视频 Assets 。

如果我尝试在刺激器(原文如此)中运行这个东西,它会播放第一个 Assets ,然后开始播放第二个 Assets ,然后就死掉了。有时它甚至没有通过第一个 Assets 。

现在,我了解到 sim 卡的行为与设备不同,所以我也在设备上进行了尝试,但遇到了同样的问题。

当我记录项目的各种状态变化时,我看到缓冲区用完了,玩家就死了。对于正在播放项目队列的构造,这对我来说似乎有点愚蠢……当然缓冲区可能会不足,但为什么它会死掉?

我是在做错什么,还是它应该如何表现?

我通过观察 loadedTimeRanges 属性以及它何时更改向播放器发送 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 上更改下一个文件的队列,这可能会解决您的问题。我正在使用它来实现无缝播放。

关于ios6 - AVQueuePlayer 挫败感(缓冲区欠载处理),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14247306/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com