发生内存泄漏多次使用GPUImageMovieWriter时

时间:2015-01-09 09:24:26

标签: ios objective-c memory-leaks gpuimage

我需要哪些步骤来释放GPUImageMovieWriter对象? 如果我想安全地多次使用MovieWriter,该怎么办?

使用我创建的GPUImage在应用程序中发生了内存泄漏。 输出超过movieWriter视频两倍时发生内存泄漏。 使用Instruments进行调试,结果表明GPUImageMovieWriter尚未发布。

实施概述

@property (nonatomic, strong) GPUImageMovieComposition *gpuMovieFileComp;
@property (nonatomic, weak) GPUImageMovieWriter *movieWriter;
@property (nonatomic, weak) GPUImageFilter *exportFilter;
@property (nonatomic, weak) AVMutableComposition *mixComposition;
@property (nonatomic, weak) AVMutableVideoComposition *transformVideoComposition;
@property (nonatomic, weak) AVMutableAudioMix *mutableAudioMix;

_gpuMovieFileComp = [[GPUImageMovieComposition alloc] initWithComposition:self.mixComposition andVideoComposition:self.transformVideoComposition andAudioMix:self.mutableAudioMix];
GPUImageMovieWriter *mr = [[GPUImageMovieWriter alloc]initWithMovieURL:_exportUrl size:CGSizeMake(MOVIE_SIZE_W, MOVIE_SIZE_H)];
[_gpuMovieFileComp enableSynchronizedEncodingUsingMovieWriter:mr];
_movieWriter = mr;
mr = nil;

_movieWriter.shouldPassthroughAudio = YES;
_movieWriter.encodingLiveVideo = NO;
_movieWriter.hasAudioTrack = YES;
_gpuMovieFileComp.playAtActualSpeed = YES;
_gpuMovieFileComp.audioEncodingTarget = _movieWriter;

[_gpuMovieFileComp addTarget:_exportFilter];
[_exportFilter addTarget:_movieWriter];

[_movieWriter setCompletionBlock:^{
    weakSelf.gpuMovieFileComp removeTarget:weakSelf.exportFilter];
    [weakSelf.exportFilter removeTarget:weakSelf.MovieWriter];
    [weakSelf.movieWriter finishRecording];
}];
[_gpuMovieFileComp startProcessing];
[_movieWriter startRecording];

我在GPUImage中的Sample Program中的SimpleVideoFilter中发生了确认或类似的内存泄漏。 向SimpleVideoFilter的xib添加UI按钮,文件输出方法已被修改为在动作中触发。

-(IBAction)startBtn:(id)sender
{
    NSURL *sampleURL = [[NSBundle mainBundle] URLForResource:@"sample_iPod" withExtension:@"m4v"];

    movieFile = [[GPUImageMovie alloc] initWithURL:sampleURL];
    movieFile.runBenchmark = YES;
    movieFile.playAtActualSpeed = NO;
    …

因此,现在可以多次调用movieWriter。 使用仪器进行了多次文件输出,确认了GPUImageMovieWriter在第二次或以后的内存泄漏。

漏洞对象

movieWriter = [[GPUImageMovieWriter alloc] initWithMovieURL:movieURL size:CGSizeMake(640.0, 480.0)];

这是GPUImageMovieWriter的问题吗? 或者我的代码有问题吗?如果有解决方案,请告诉我。 抱歉我的英语不好。我正在等待建议。 谢谢。

2 个答案:

答案 0 :(得分:5)

最后,我解决了这个问题。 GPUImageMovieWriter中的_movieWriterContext被泄露了对象。 我重写了GPUImageMovieWriter.m,如下所示。

97 //    _movieWriterContext = [[GPUImageContext alloc] init];
98     _movieWriterContext = [GPUImageContext sharedImageProcessingContext];
99 //    [_movieWriterContext useSharegroup:[[[GPUImageContext sharedImageProcessingContext] context] sharegroup]];

目前,内存泄漏不再发生,崩溃导致内存压力也不再发生。 我希望这个解决方案能够帮助那些面临同样问题的人。

答案 1 :(得分:0)

关注@ ootknym的回答,这里是GPUImage 0.1.7的一个分支,带有变化:

https://github.com/getnexar/GPUImage.git