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

时间:2015-11-30 23:27:16

标签: ios objective-c avplayer avplayerlayer avplayeritem

我正在开发一款iOS应用,可以创建用户池提交的所有视频的Feed,使用户可以浏览和查看其他人创建的视频。您可以想象,我需要能够在Feed中支持任意数量的视频。

目前,我正在为每个视频创建并保留一个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];

当用户点击play时,我在_videoPlayer上致电UIView,一切正常。也就是说,直到有足够的视频提交给Feed ...

如果Feed中存在超过18个视频,则AVPlayer的新实例将无法播放,而_videoPlayer.currentItem.statusAVPlayerItemStatusFailed出现模糊错误Code=-11800 "The operation could not be completed"。有趣的是,无论前18个视频的长度和质量如何,它始终是第19个视频,它是第一个被打破的视频。

我认为我不应该创建所有这些AVPlayer实例。我尝试使用AVPlayer单例包装器,当用户想要播放视频时,我将共享的AVPlayer实例传递给相关的UIView。这消除了AVPlayerItemStatusFailed错误,但使播放显着滞后。

我无法找到有关此问题的任何其他说明。如果有人能够提供一些有关这种情况的更好方法的见解,或者甚至指向一个好的AVPlayer教程的方向,我将非常感激。谢谢!

1 个答案:

答案 0 :(得分:11)

如果有人遇到同样的问题,我最终会创建一个解决方案。事实证明,AVPlayer实例的数量受到iPhone硬件的限制,我希望Apple能够更清楚地说明这一点。 This question touches on that.

为了解决此限制,我为每个我想播放的视频创建并保留AVURLAssetAVPlayerItem。在播放视频时,我会动态创建AVPlayer实例(不是共享实例),将AVPlayerItem添加到其中,然后播放视频。视频播放完毕后,我会销毁AVPlayer实例以释放硬件。这对我和我的专业情况都很有效,但如果您遇到上述问题,这种情况的某些变化也会对您有所帮助。

小咆哮:

在过去的几个月里,我一直在广泛地使用AVFoundation,以多种不同的方式操纵不同类型的媒体。我经常发现自己在诅咒Apple的骨架文档以及与AVFoundation框架相关的示例。我希望他们能够支持他们的文档,因为很多框架都是错综复杂且不直观的。在互联网尘土飞扬的角落里,这种微小的咆哮不会改变任何东西,但我想我只是在发泄。

结束咆哮