我需要哪些步骤来释放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的问题吗? 或者我的代码有问题吗?如果有解决方案,请告诉我。 抱歉我的英语不好。我正在等待建议。 谢谢。
答案 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的一个分支,带有变化: