【问题标题】:AVPlayerItemStatusFailed error when too many AVPlayer instances created创建太多 AVPlayer 实例时出现 AVPlayerItemStatusFailed 错误
【发布时间】:2015-11-30 23:27:15
【问题描述】:

我正在开发一个 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...

一旦提要中存在超过 18 个视频,AVPlayer 的新实例将无法播放,_videoPlayer.currentItem.status 将变为 AVPlayerItemStatusFailed,并出现模棱两可的错误 Code=-11800 "The operation could not be completed"。有趣的是,无论前 18 个视频的长度和质量如何,总是第 19 个视频最先被破坏。

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

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

【问题讨论】:

    标签: ios objective-c avplayer avplayerlayer avplayeritem


    【解决方案1】:

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

    为了绕过这个限制,我为每个我想播放的视频创建并保留一个AVURLAsset 和一个AVPlayerItem。播放视频时,我会即时创建一个AVPlayer 实例(不是共享实例),将AVPlayerItem 添加到其中,然后播放视频。视频播放完毕后,我销毁AVPlayer 实例以释放硬件。这对我和我的专业情况很有效,但如果您遇到上述问题,这也应该对您有所帮助。

    小吐槽:

    在过去的几个月里,我一直在与 AVFoundation 进行相当广泛的合作,以多种不同的方式操纵不同类型的媒体。我经常发现自己在诅咒 Apple 的骨架文档和与 AVFoundation 框架相关的示例。我希望他们会为此支持他们的文档,因为很多框架都是令人费解且不直观的。互联网上尘土飞扬的角落里的这种小小的咆哮不会改变任何事情,但我想我只是在发泄。

    结束咆哮

    【讨论】:

    猜你喜欢
    • 2014-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-06
    • 2012-01-10
    • 2017-01-30
    • 2023-01-12
    • 2015-02-20
    相关资源
    最近更新 更多