【发布时间】: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