我有一个tvOS应用程序,里面有一个视频播放。 基本上有两个视频(同一视频的不同速度版本)。一个是12MB大小,另一个是1.9MB。
当应用程序启动时,它运行正常(Xcode显示191MB)。但是,当单击正常速度按钮一次时,内存将达到350MB。当我分别单击普通和快速按钮时,这会继续增加,并且一度变为1GB +。你可以看到附件。当视频结结并且应用停止时,它甚至达到了3GB。
有没有办法解决内存问题并保存应用程序停止?
另一个问题是:在Apple TV中,我们从此应用程序转到另一个应用程序并返回,视频再次停止。但是,在模拟器中,它没有发生。有人可以帮我解决这两个问题吗?
以下是我正在使用的代码:
virtualenv
答案 0 :(得分:1)
我在你的代码中看到两个问题:
playVideoWithURL
方法时,都会创建新的AVPlayer
实例,而不是重用已有的实例。如果要播放其他网址,可以在player
媒体资源上调用replaceCurrentItem(with:)方法。 这本身有点低效,但不应该导致您描述的内存问题。我认为原因是:
loopVideo
方法时,都会将闭包传递给NotificationCenter.default.addObserver
。此闭包创建了对videoPlayer
的强引用。您永远不会从通知中心删除观察者。 每次创建新的loopVideo
实例时调用AVPlayer
,这些实例永远不会被释放,从而导致您描述的内存问题。
要解决此问题,您可以:
player
初始化playVideoWithURL
属性,然后在您想要播放其他视频时使用replaceCurrentItem
NotificationCenter.default.addObserver
传递给NotificationCenter.default.addObserver
的闭包会造成内存泄漏(请参阅this question)。您可以通过弱地捕获self
来摆脱它:
NotificationCenter.default.addObserver(forName:
NSNotification.Name.AVPlayerItemDidPlayToEndTime,object: nil, queue: nil) { [weak self], notification in
self?.player.seek(to: kCMTimeZero)
self?.player.play()
}
还要记得在removeObserver
课程的deinit
方法中拨打VideoPlay
。