【问题标题】:Video loop is freezing my iOS app at some point视频循环在某些时候冻结了我的 iOS 应用程序
【发布时间】:2014-03-06 14:13:59
【问题描述】:

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

这是运行 14 小时后的 Instruments 会话:

我对 Instruments 还不是很熟悉,虽然 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"];
    }
}

编辑:起初我的客户告诉我它崩溃了,但看起来它实际上冻结了,视频停止播放并且应用程序没有响应。有什么想法吗?

【问题讨论】:

  • 您是否有崩溃报告告诉您这是由于内存压力造成的?并为这个愚蠢的问题道歉,但是这个信息亭肯定会全天为垫子充电?
  • 不幸的是我没有,因为它发生在现场。我无法重现它,因为视频正在通过辅助屏幕,如果我连接它,我无法将设备连接到 Xcode。 Instruments 在模拟器上运行,虽然它没有崩溃,但当我在 14 小时后尝试使用它时,该应用程序完全没有响应。
  • 您的应用是否监控可用磁盘空间?
  • 您应该能够从 Organizer 获得崩溃报告。或者使用 Hockeyapp/Airbrake 之类的东西进行远程崩溃报告
  • @bneely 不,它没有。但是为什么磁盘空间会成为问题呢?我没有向磁盘写入任何内容。

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


【解决方案1】:

我无法回答您关于崩溃的问题,只能确认我们在这里看到过类似的崩溃,可能是同一问题。

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

我希望Overall Bytes 的数量或多或少与size of video * play count 成正比。

【讨论】:

    【解决方案2】:

    我从未使用过 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-14
      • 1970-01-01
      • 2012-06-14
      • 2020-02-09
      • 2023-01-27
      相关资源
      最近更新 更多