0

我在我的应用程序中使用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 首歌曲之后。

4

3 回答 3

2

你有内存泄漏。每次创建AVPlayerwithalloc: init:并将其分配给audioPlayer. 这使它的保留计数为 1。然后您创建一个AVPlayerLayer它再次增加其保留计数。

稍后,您释放avPlayerLayer减少保留计数的值,audioPlayer但它永远不会回到零,因此永远不会被释放。

泄漏很糟糕,但你也遇到了另一个问题。iOS 中的基础设施限制为最多 4 个音频/视频渲染管道。当您创建第五个时,它无法获取渲染管道,因此播放失败。

要解决您的问题,请更正内存泄漏。

audioPlayer = [AVPlayer playerWithURL:[NSURL fileURLWithPath:fileName]];

使用playerWithURL:静态工厂构造函数将隐式执行一个autorelease:,减少该对象的保留计数并避免泄漏。

于 2013-06-17T20:52:12.910 回答
0

真的没有理由仅仅为了改变输入而创建新的 AVPlayer 和 AVPlayerLayer 实例。您真正需要的只是一个新的 AVPlayerItem。将其分配给当前的 AVPlayer 并继续使用您现有的 AVPlayerLayer。

于 2013-03-24T17:57:07.863 回答
-1

通常,要自定义您的 MPMovie 播放器,最好将 AVPlayerLayer 与 AVPlayer 一起使用。

通过使用此自定义播放器,您可以根据需要自定义播放器控件(播放/暂停、后退、前进、停止和音量等)。

于 2013-07-12T13:44:07.427 回答