减少AVPlayer视频内存使用

时间:2013-07-22 06:26:51

标签: ios ios6 avplayer

我们有一个视频播放器,我们在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正在显示我们的Dirty Size会变得疯狂。一旦我们播放了第一个8MB文件,我们接近大约80MB的脏。随着我们更换越来越多的视频,我们可以轻松地将我们的Dirty Size变为200MB +。在大约20-30个视频中,应用程序通常会被杀死,我们会收到一个低内存崩溃日志。

当我们替换播放器中的剪辑时,我们应该做些什么来减少AVPlayer的内存吗?

2 个答案:

答案 0 :(得分:0)

我找到了设置:

    [someAssetWriterInput setExpectsMediaDataInRealTime:NO];

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

答案 1 :(得分:0)

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

这将控制您的内存,并且仅占用所需的内存。这解决了我的问题。