视频循环在某些时候冻结了我的iOS应用程序

时间:2014-03-06 14:14:00

标签: ios objective-c memory-management instruments avplayer

我有一个在Kiosk上运行的应用程序,打开全天循环播放的视频。最终,大约1天后,应用程序冻结。

以下是运行14小时后的仪器会话: enter image description here enter image description here enter image description here enter image description here

我对仪器还不是很熟悉,虽然Live Bytes保持一致且低,但其他值似乎非常高。但同样,我不确定这是否正常。

这是我创建视频播放器的方式:

- (void)setupInitialContentWithBounds:(CGRect)externalScreenBounds
{   
    avPlayer = [[AVPlayer alloc] init];
    avPlayerLayer = [AVPlayerLayer playerLayerWithPlayer:avPlayer];
    avPlayerLayer.frame = externalScreenBounds;
    [self.externalWindow.layer addSublayer:avPlayerLayer];
    avPlayer.actionAtItemEnd = AVPlayerActionAtItemEndNone;
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(playerItemDidReachEnd:)
                                                 name:AVPlayerItemDidPlayToEndTimeNotification
                                               object:[avPlayer currentItem]];

    [self playVideo:@"Idle"];
}

这是playVideo方法:

- (void)playVideo:(NSString *)name
{
    currentVideo = name;
    NSString *filepath = [[NSBundle mainBundle] pathForResource:name ofType:@"mp4"];
    NSURL *fileURL = [NSURL fileURLWithPath:filepath];
    AVPlayerItem *playerItem = [[AVPlayerItem alloc] initWithURL:fileURL];
    [avPlayer replaceCurrentItemWithPlayerItem:playerItem];
    [avPlayer play];
}

此处视频结束时的通知监听器:

- (void)playerItemDidReachEnd:(NSNotification *)notification
{
    if([currentVideo isEqualToString:@"Idle"])
    {
        //Keeps looping the Idle video until another one is selected
        AVPlayerItem *p = [notification object];
        [p seekToTime:kCMTimeZero];
    }

    else
    {
        NSLog(@"Just finished a different video, so go back to idle");
        [self playVideo:@"Idle"];
    }
}
编辑:起初我的客户告诉我它崩溃了,但看起来它实际上已经冻结,视频停止播放,应用程序没有响应。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

我不能回答你关于崩溃的问题,除非确认我们在这里看到类似的崩溃可能是同一个问题。

但是我可以帮助你更好地解释乐器的显示效果。我不担心Overall Bytes# Overall值非常高。这些测量自应用程序启动以来(或自附加仪器以来)分配的内存总量。也就是说,分配1MB然后释放它将为这些总数增加1MB。

我希望Overall Bytes金额或多或少与size of video * play count成比例。

答案 1 :(得分:0)

我从未使用过AVPlayer课程,但我们为展览提供了一个类似的无限视频循环应用场景

总的来说,如果你的应用程序运行了很长时间,它看起来就会有一些内存。也许AVPlayer导致一些内存泄漏?!

  • 关于视频结束事件:释放您的播放器(设置为nil)并重新初始化(如启动时),而不是循环播放。如果有些"垃圾"应该落后,ARC可能会做其余的事情......

    //release your player (taken from here: http://stackoverflow.com/questions/17831764/how-to-stop-a-video-in-avplayer)
    [self.videoPlayer Pause];
    [self.avPlayerLayer removefromsuperlayer];
    self.videoPlayer = nil;
    
    //re-init
    
  • 确保您的setupInitialContentWithBounds只被调用一次,否则您可能会多次致电addObserver,这会导致奇怪的副作用(或者您在某个时候致电removeObserver