注意点 :
1、processFrame:方法中 resultPixelBuffer避免内存暴涨的写法
@interface VideoProcessingManager ()
@property (nonatomic, strong) MFPixelBufferHelper *pixelBufferHelper;
@property (nonatomic, assign) CVPixelBufferRef resultPixelBuffer;
@end
@implementation VideoProcessingManager
- (instancetype)init {
self = [super init];
if (self) {
}
return self;
}
#pragma mark - CapturerManagerDelegate
- (CVPixelBufferRef)processFrame:(CVPixelBufferRef)pixelBuffer {
CVPixelBufferRef outputPixelBuffer = pixelBuffer;
// 关键代码 这里一定要这么写 否则内存暴涨
if (!self.resultPixelBuffer) {
CVPixelBufferRef pixelBuffer = [self renderByGPUImage:outputPixelBuffer];
self.resultPixelBuffer = pixelBuffer;
CVPixelBufferRelease(pixelBuffer);
}
outputPixelBuffer = self.resultPixelBuffer;
return outputPixelBuffer;
}
- (void)setResultPixelBuffer:(CVPixelBufferRef)resultPixelBuffer {
if (_resultPixelBuffer &&
resultPixelBuffer &&
CFEqual(resultPixelBuffer, _resultPixelBuffer)) {
return;
}
if (resultPixelBuffer) {
CVPixelBufferRetain(resultPixelBuffer);
}
if (_resultPixelBuffer) {
CVPixelBufferRelease(_resultPixelBuffer);
}
_resultPixelBuffer = resultPixelBuffer;
}
- (MFPixelBufferHelper *)pixelBufferHelper {
if (!_pixelBufferHelper) {
EAGLContext *context = [[GPUImageContext sharedImageProcessingContext] context];
_pixelBufferHelper = [[MFPixelBufferHelper alloc] initWithContext:context];
}
return _pixelBufferHelper;
}
- (CVPixelBufferRef)renderByGPUImage:(CVPixelBufferRef)pixelBuffer {
CVPixelBufferRetain(pixelBuffer);
__block CVPixelBufferRef output = nil;
__weak typeof(self) weakSelf = self;
runSynchronouslyOnVideoProcessingQueue(^{
[GPUImageContext useImageProcessingContext];
// (1)
GLuint textureID = [weakSelf.pixelBufferHelper convertYUVPixelBufferToTexture:pixelBuffer];
CGSize size = CGSizeMake(CVPixelBufferGetWidth(pixelBuffer),
CVPixelBufferGetHeight(pixelBuffer));
[GPUImageContext setActiveShaderProgram:nil];
// (2)
GPUImageTextureInput *textureInput = [[GPUImageTextureInput alloc] initWithTexture:textureID size:size];
// GPUImageSmoothToonFilter *filter = [[GPUImageSmoothToonFilter alloc] init];
// [textureInput addTarget:filter];
GPUImageBrightnessFilter *brightNessFilter = [[GPUImageBrightnessFilter alloc] init];
brightNessFilter.brightness = -1;
[textureInput addTarget:brightNessFilter];
GPUImageTextureOutput *textureOutput = [[GPUImageTextureOutput alloc] init];
// [filter addTarget:textureOutput];
//
[brightNessFilter addTarget:textureOutput];
[textureInput processTextureWithFrameTime:kCMTimeZero];
// (3)
output = [weakSelf.pixelBufferHelper convertTextureToPixelBuffer:textureOutput.texture
textureSize:size];
[textureOutput doneWithTexture];
glDeleteTextures(1, &textureID);
});
CVPixelBufferRelease(pixelBuffer);
return output;
}
@end
MFPixelBufferHelper 见:【CVPixelBufferRef】添加滤镜的方法_allanGold的博客-优快云博客