Уменьшить использование видеопамяти AVPlayer

У нас есть видеопроигрыватель, в котором мы воспроизводим видео в AVPlayer (1 ГБ контента размером около 8 МБ .mov). Мы загружаем AVPlayer с помощью AVMutableComposition видеодорожки и аудиодорожки, которые находятся на локальном диске в комплекте с приложением.

Мы делаем что-то вроде:

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 сходит с ума. Как только мы играем первый 8-мегабайтный файл, мы приближаемся к 80 МБ грязных. Поскольку мы заменяем все больше и больше видео, мы можем легко получить наш Dirty Size до 200MB +. В течение примерно 20-30 видео приложение обычно будет убито, и мы получим журнал сбоев с низкой памятью.

Есть ли что-то особенное, что мы должны делать, чтобы уменьшить память AVPlayer при замене клипов в проигрывателе?

Interesting Posts
PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.