Уменьшите использование видеопамяти 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()

Это будет контролировать вашу память и займет только необходимую память. это решило мою проблему.

Другие вопросы по тегам