4

我们有一个视频播放器,可以在其中播放 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 的内存?

4

2 回答 2

0
        self.player?,pause()
        self.activityIndicator?.startAnimating()
        self.removeObserverPlayerItem()
        let item = AVPlayerItem(url: fileurl)
        player?.replaceCurrentItem(with: item)
        self.addObserverPlayerItem()
        self.player?.play()

这将控制你的记忆,只需要需要的记忆。这解决了我的问题。

于 2019-05-22T09:41:07.390 回答
0

我发现该设置:

    [someAssetWriterInput setExpectsMediaDataInRealTime:NO];

.. 对面向 AVComposition 的导出会话期间所经历的内存压力有一些影响 .. 它似乎至少是一种管理框架内内部内存使用的方法 ..

于 2018-02-22T17:51:48.067 回答