我有一个在Kiosk上运行的应用程序,打开全天循环播放的视频。最终,大约1天后,应用程序冻结。
以下是运行14小时后的仪器会话:
我对仪器还不是很熟悉,虽然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"];
}
}
编辑:起初我的客户告诉我它崩溃了,但看起来它实际上已经冻结,视频停止播放,应用程序没有响应。有什么想法吗?
答案 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
)