我使用AVPlayerLayer和AVPlayer在我的应用程序中构建了一个视频播放器。
当一个新的视频被选中时,我会使用这个方法:
//this to remove the current video
if (avPlayerLayer) {
[[NSNotificationCenter defaultCenter] removeObserver:self name:AVPlayerItemDidPlayToEndTimeNotification object:[audioPlayer currentItem]];
[avPlayerLayer.player pause];
[avPlayerLayer removeFromSuperlayer];
avPlayerLayer = nil;
}
//and this is to add a new one
audioPlayer = [[AVPlayer alloc]initWithURL:[NSURL fileURLWithPath:fileName]];
avPlayerLayer = [[AVPlayerLayer playerLayerWithPlayer:audioPlayer] retain];
[avPlayerLayer setFrame:self.view.bounds];
CGRect frame = avPlayerLayer.frame;
[avPlayerLayer setFrame:CGRectMake(frame.origin.x, frame.origin.y - 30, frame.size.width, frame.size.height)];
[[self.view layer] addSublayer:avPlayerLayer];
[audioPlayer play];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(finishPlayingSong)
name:AVPlayerItemDidPlayToEndTimeNotification
object:[audioPlayer currentItem]];
[audioPlayer release];现在,当我执行这种方法的时候,设备不会开始播放视频(它是同时发生的,并且不是在同一个视频上)。你知道为什么会这样吗?我该怎么处理呢?
编辑
我注意到它发生在我播放了5首歌之后。
发布于 2013-06-18 04:52:13
你有一个内存泄漏。每次使用alloc: init:创建AVPlayer并将其分配给audioPlayer时。这将使其保留计数为1。然后创建一个AVPlayerLayer,它会再次递增其保留计数。
稍后,您释放avPlayerLayer,这会减少audioPlayer上的保留计数,但它永远不会回到零,因此永远不会被释放。
泄漏是很糟糕的,但你也遇到了另一个问题。iOS对a maximum of 4 audio/video render pipelines有一个基础设施上的限制。当您创建第五个时,它无法获取渲染管道,因此回放失败。
要解决您的问题,请更正内存泄漏。
audioPlayer = [AVPlayer playerWithURL:[NSURL fileURLWithPath:fileName]];使用playerWithURL:静态工厂构造函数将隐式执行autorelease:,从而减少该对象的保留计数并避免泄漏。
发布于 2013-03-25 01:57:08
实际上,没有理由仅仅为了更改输入而创建新的AVPlayer和AVPlayerLayer实例。你真正需要的只是一个新的AVPlayerItem。将其分配给当前AVPlayer并继续使用现有AVPlayerLayer。
发布于 2013-07-12 21:44:07
一般来说,要自定义您的MPMovie播放器,最好使用带有AVPlayer的AVPlayerLayer。
通过使用此自定义播放器,您可以自定义播放器控制(播放/暂停、后退、前进、停止和音量等)。随你便。
https://stackoverflow.com/questions/10397081
复制相似问题