Уменьшите использование видеопамяти 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 при замене клипов в плеере?
1 ответ
Я нашел эту настройку:
[someAssetWriterInput setExpectsMediaDataInRealTime:NO];
... оказывает некоторое влияние на нехватку памяти, возникающую во время сеансов экспорта, ориентированных на AVComposition.. казалось бы, по крайней мере, один из способов управлять использованием внутренней памяти в рамках..
self.player?,pause()
self.activityIndicator?.startAnimating()
self.removeObserverPlayerItem()
let item = AVPlayerItem(url: fileurl)
player?.replaceCurrentItem(with: item)
self.addObserverPlayerItem()
self.player?.play()
Это будет контролировать вашу память и займет только необходимую память. это решило мою проблему.