我正在开发一个 iOS 应用程序,它创建用户池提交的所有视频的提要,使用户能够浏览和查看其他人创建的视频。正如您可以想象的那样,我需要能够支持 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];
I call play
on _videoPlayer
当用户点击UIView
,一切都很完美。也就是说,直到有足够的视频提交到 feed 为止......
一旦 Feed 中存在超过 18 个视频,新的实例AVPlayer
不会玩,并且_videoPlayer.currentItem.status
将AVPlayerItemStatusFailed
有一个不明确的错误Code=-11800 "The operation could not be completed"
。有趣的是,无论前 18 个视频的长度和质量如何,第一个崩溃的总是第 19 个视频。
我认为我不应该创建所有这些 AVPlayer 实例。我尝试使用 AVPlayer 单例包装器,当用户想要播放视频时,我将共享的 AVPlayer 实例传递给相关的 UIView。这消除了AVPlayerItemStatusFailed
错误,但使播放变得无法使用的滞后。
我还没有找到这个问题的任何其他帐户。如果有人可以提供一些关于解决这种情况的更好方法的见解,或者甚至为我指出一个好的 AVPlayer 教程的方向,我将非常感激。谢谢!
如果有人遇到同样的问题,我最终创建了一个解决方法。事实证明,AVPlayer 实例的数量受到 iPhone 硬件的限制,我希望苹果能更清楚地说明这一点。这个问题就涉及到这一点。
为了解决这个限制,我创建并保留了一个AVURLAsset
以及一个AVPlayerItem
对于我想播放的每个视频。当需要播放视频时,我创建一个AVPlayer
动态实例(不是共享实例),添加AVPlayerItem
并播放视频。视频播放完毕后,我销毁了AVPlayer
实例来释放硬件。这对于我和我的特殊情况来说效果很好,但是如果您遇到上述问题,那么这种方法的一些变化也应该对您有所帮助。
小吐槽:
在过去的几个月里,我一直在与 AVFoundation 进行广泛的合作,以多种不同的方式操作不同类型的媒体。我经常发现自己咒骂苹果的框架文档和与 AVFoundation 框架相关的示例。我希望他们能够为此支持他们的文档,因为很多框架都是复杂且不直观的。在互联网尘土飞扬的角落里发出的小小的咆哮不会改变任何事情,但我想我只是在发泄。
end rant
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)