创建太多AVPlayer实例时出现AVPlayerItemStatusFailed错误

5

我正在开发一款iOS应用程序,该应用程序创建了一个由用户提交的所有视频组成的信息流,使用户能够浏览和查看其他人创建的视频。正如您所想象的那样,我需要支持任意数量的视频。

目前,我正在为每个视频创建和保留一个AVPlayer实例,如下所示:

//inside the init method of a UIView

//create the AVPlayer and store it in a strong property
NSString * urlString = @"aRemoteURL.mov";
NSURL * movURL = [NSURL URLWithString:urlString];
_videoPlayer = [[AVPlayer alloc]initWithURL:movURL];

//register callbacks for handling buffering
[_videoPlayer.currentItem addObserver:self forKeyPath:@"playbackBufferEmpty" options:NSKeyValueObservingOptionNew context:nil];
[_videoPlayer.currentItem addObserver:self forKeyPath:@"playbackLikelyToKeepUp" options:NSKeyValueObservingOptionNew context:nil];

//add the AVPlayerLayer to the view so you can see the video
AVPlayerLayer * playerLayer = [AVPlayerLayer playerLayerWithPlayer:_videoPlayer];
playerLayer.frame = self.frame;
[self.layer addSublayer:playerLayer];

用户点击UIView时,我在_videoPlayer上调用play,一切都正常工作。但是,当足够多的视频被提交到feed中时...

在feed中存在超过18个视频时,新的AVPlayer实例将无法播放,并且_videoPlayer.currentItem.status将是带有模糊错误代码Code=-11800 "无法完成操作"AVPlayerItemStatusFailed。有趣的是,无论前18个视频的长度和质量如何,总是第19个视频最先出问题。

我想这些AVPlayer实例不应该全部由我创建。我尝试使用AVPlayer单例包装器,在用户想要播放视频时,我向相关的UIView传递了一个共享的AVPlayer实例。这消除了AVPlayerItemStatusFailed错误,但使回放效果极其卡顿。

我还没有找到任何关于这个问题的其他解决方案。如果有人能提供一些关于更好的处理此情况的见解,或者指点我一个好的AVPlayer教程,我会非常感激。谢谢!

1个回答

13
如果有人遇到类似的问题,我找到了一个解决办法。原来iPhone硬件限制了AVPlayer实例的数量,我希望苹果能更加清楚地说明这一点。这个问题涉及到了这一点。 为了绕过这个限制,我为每个想要播放的视频创建并保留了一个AVURLAsset以及一个AVPlayerItem。当播放视频的时候,我动态地创建一个AVPlayer实例(而不是共享实例),将AVPlayerItem添加到其中,并播放视频。视频播放完成后,我销毁AVPlayer实例以释放硬件资源。对于我的特殊情况,这个方法效果很好,但如果你遇到上述问题,这个方法的某个变体应该也能帮助你。
小抱怨:
过去几个月里,我在相当大的范围内使用AVFoundation,以各种不同的方式处理各种类型的媒体。我经常发现自己在诅咒苹果关于AVFoundation框架的文档和示例的贫乏。我希望他们能加强这方面的文档,因为这个框架的很多部分都很复杂和难以理解。在这个角落里的小抱怨不会改变什么,但我想我只是发泄一下。

你如何销毁AVPlayer?我无法找到如何取消关联共享的AVPlayerItem:http://stackoverflow.com/questions/37958398/how-to-disconnect-avplayer-from-avplayeritem - Cbas
1
好的发泄。同意。 - Jacolack

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接