首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AVPlayerLayer和AVPlayer

AVPlayerLayer和AVPlayer
EN

Stack Overflow用户
提问于 2012-05-01 19:33:48
回答 3查看 4.8K关注 0票数 0

我使用AVPlayerLayerAVPlayer在我的应用程序中构建了一个视频播放器。

当一个新的视频被选中时,我会使用这个方法:

代码语言:javascript
复制
//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首歌之后。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-06-18 04:52:13

你有一个内存泄漏。每次使用alloc: init:创建AVPlayer并将其分配给audioPlayer时。这将使其保留计数为1。然后创建一个AVPlayerLayer,它会再次递增其保留计数。

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

泄漏是很糟糕的,但你也遇到了另一个问题。iOS对a maximum of 4 audio/video render pipelines有一个基础设施上的限制。当您创建第五个时,它无法获取渲染管道,因此回放失败。

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

代码语言:javascript
复制
audioPlayer = [AVPlayer playerWithURL:[NSURL fileURLWithPath:fileName]];

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

票数 2
EN

Stack Overflow用户

发布于 2013-03-25 01:57:08

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

票数 0
EN

Stack Overflow用户

发布于 2013-07-12 21:44:07

一般来说,要自定义您的MPMovie播放器,最好使用带有AVPlayer的AVPlayerLayer。

通过使用此自定义播放器,您可以自定义播放器控制(播放/暂停、后退、前进、停止和音量等)。随你便。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10397081

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档