我正在开发一个应用程序,其中有一个集合视图,并且集合视图的单元格可以包含视频。现在我正在使用 AVPlayer和 AVPlayerLayer显示视频。不幸的是,滚动性能非常糟糕。看起来 AVPlayer、 AVPlayerItem和 AVPlayerLayer在主线程上做了很多工作。他们不断取出锁,等待信号量等,这阻塞了主线程,并造成严重的帧下降。
有没有办法告诉 AVPlayer停止在主线程上做这么多事情?到目前为止,我还没有尝试解决这个问题。
我还尝试用 AVSampleBufferDisplayLayer构建一个简单的视频播放器。使用它,我可以确保所有的事情都发生在主线程之外,我可以在滚动和播放视频时达到 ~ 60 fps。不幸的是,这种方法的级别要低得多,而且它不提供音频播放和时间擦洗等功能。有没有什么方法可以获得类似的性能与 AVPlayer?我宁愿用那个。
编辑:
深入研究之后,看起来在使用 AVPlayer时不可能获得良好的滚动性能。创建一个 AVPlayer并与一个 AVPlayerItem实例关联将启动一系列工作,这些工作将蹦床到主线程上,然后在主线程上等待信号量并尝试获取一系列锁。随着 scrollview 中视频数量的增加,主线程停止运行的时间急剧增加。
AVPlayer交易量似乎也是一个巨大的问题。处理一个 AVPlayer也试图同步一些东西。同样,当你创造更多的玩家时,情况会变得非常糟糕。
这是相当令人沮丧的,它使 AVPlayer几乎不可用我正在尝试做的事情。像这样阻止主线是如此业余的事情,所以很难相信苹果的工程师会犯这样的错误。不管怎样,希望他们能尽快解决这个问题。