我们有一个视频播放器,可以在其中播放 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 显示我们的脏大小正在变得疯狂。一旦我们播放第一个 8MB 文件,我们就会接近 80MB 的脏文件。随着我们替换越来越多的视频,我们可以轻松地将脏大小增加到 200MB+。在大约 20-30 个视频内,该应用程序通常会被终止,并且我们会得到一个低内存崩溃日志。
当我们替换播放器中的剪辑时,我们应该做些什么来减少 AVPlayer 的内存?