2016-05-03 12 views
0

Ich arbeite an einer Live-App. Ich muss Filter in Videopuffer hinzufügen. Dann habe ich GPUImage Framework und schreibe einen Filter. Es sieht gut aus, aber der Puffer ohne Filterwirkung in der 'willOutputSampleBuffer:' Funktion.iOS GPUImage Filter können nicht in Video-Puffer mischen

Hier sind einige Schlüsselcode:

self.videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:self.sessionPreset cameraPosition:AVCaptureDevicePositionFront]; 
    self.videoCamera.delegate = self; 
    self.videoCamera.horizontallyMirrorFrontFacingCamera = YES; 

    self.filterView = [[GPUImageView alloc] init]; 

    GPUImageBeautifyFilter *beautifyFilter = [[GPUImageBeautifyFilter alloc] init]; 
    [self.videoCamera addTarget:beautifyFilter]; 
    [beautifyFilter addTarget:self.filterView]; 


    dispatch_async(dispatch_get_main_queue(), ^{ 
     [self.view insertSubview:self.filterView atIndex:1]; 
     [self.filterView mas_makeConstraints:^(MASConstraintMaker *make) { 
      make.edges.equalTo(self.view); 
     }]; 
     [self.videoCamera startCameraCapture]; 
    }); 

Gibt es eine Detail, das ich ignoriert? Vielen Dank!!!

Antwort

0

Ich muss eine neue Ausgabe zum Ziel des Filters hinzufügen, also füge ich diesen Code in meinem Projekt hinzu, dann bekomme ich den Puffer mit Filter.

GPUImageRawDataOutput *rawDataOutput = [[GPUImageRawDataOutput alloc] initWithImageSize:CGSizeMake(720, 1280) resultsInBGRAFormat:YES]; 

[self.beautifyFilter addTarget:rawDataOutput]; 

__weak GPUImageRawDataOutput *weakOutput = rawDataOutput; 

[rawDataOutput setNewFrameAvailableBlock:^{ 

    __strong GPUImageRawDataOutput *strongOutput = weakOutput; 
    [strongOutput lockFramebufferForReading]; 
    GLubyte *outputBytes = [strongOutput rawBytesForImage]; 
    NSInteger bytesPerRow = [strongOutput bytesPerRowInOutput]; 
    CVPixelBufferRef pixelBuffer = NULL; 
    CVPixelBufferCreateWithBytes(kCFAllocatorDefault, 720, 1280, kCVPixelFormatType_32BGRA, outputBytes, bytesPerRow, nil, nil, nil, &pixelBuffer); 

    //Do something with pixelBuffer 

    [strongOutput unlockFramebufferAfterReading];   
    CFRelease(pixelBuffer); 

}]; 
Verwandte Themen