我们有一个视频播放器,我们在AVPlayer中播放视频(1GB内容,大小约为8MB .mov文件)。我们使用与应用程序捆绑在一起的本地磁盘上的视频轨道和音轨的AVMutableComposition加载AVPlayer。
我们做的事情如下:
AVAsset* videoAsset = [[AVURLAsset alloc] initWithURL:videoUrl options:nil];
AVAsset* voiceAsset = useVoice ? [[AVURLAsset alloc] initWithURL:voiceUrl options:nil] : nil;
AVMutableComposition* composition = [[AVMutableComposition alloc] init];
AVMutableCompositionTrack* videoTrack = [composition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];
AVMutableCompositionTrack* audioTrack = [composition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];
AVMutableCompositionTrack* voiceTrack = useVoice ? [composition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid] : nil;
NSError* error = nil;
[videoTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, videoAsset.duration) ofTrack:[[videoAsset tracksWithMediaType:AVMediaTypeVideo] firstObject] atTime:kCMTimeZero error:&error];
if (error) {
[[MNGAppDelegate sharedManagers].errorManager presentError:error];
}
if ([videoAsset tracksWithMediaType:AVMediaTypeAudio].count > 0) {
[audioTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, videoAsset.duration) ofTrack:[[videoAsset tracksWithMediaType:AVMediaTypeAudio] firstObject] atTime:kCMTimeZero error:&error];
if (error) {
[[MNGAppDelegate sharedManagers].errorManager presentError:error];
}
}
if (useVoice) {
[voiceTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, voiceAsset.duration) ofTrack:[[voiceAsset tracksWithMediaType:AVMediaTypeAudio] firstObject] atTime:kCMTimeZero error:&error];
if (error) {
[[MNGAppDelegate sharedManagers].errorManager presentError:error];
}
}
我们使用replaceCurrentItemWithPlayerItem加载它(第一个除外)。
[self.player replaceCurrentItemWithPlayerItem:nextItem];
我们从不创建播放列表或可以返回。我们只需在需要播放新视频时替换它。
我们注意到VM Tracker正在显示我们的Dirty Size会变得疯狂。一旦我们播放了第一个8MB文件,我们接近大约80MB的脏。随着我们更换越来越多的视频,我们可以轻松地将我们的Dirty Size变为200MB +。在大约20-30个视频中,应用程序通常会被杀死,我们会收到一个低内存崩溃日志。
当我们替换播放器中的剪辑时,我们应该做些什么来减少AVPlayer的内存吗?
答案 0 :(得分:0)
我找到了设置:
[someAssetWriterInput setExpectsMediaDataInRealTime:NO];
..对面向AVComposition的导出会话期间遇到的内存压力有一定影响..它似乎至少是一种管理框架内部内存使用的方法..
答案 1 :(得分:0)
self.player?,pause()
self.activityIndicator?.startAnimating()
self.removeObserverPlayerItem()
let item = AVPlayerItem(url: fileurl)
player?.replaceCurrentItem(with: item)
self.addObserverPlayerItem()
self.player?.play()
这将控制您的内存,并且仅占用所需的内存。这解决了我的问题。