美颜开启后,打开双流,远端查看小流时,小流闪烁问题
项目中使用的是GPUImage进行的美颜处理,添加了美白、磨皮、亮光,但是当开启美颜效果后,如果只使用大流进行查看视频,视频美颜正常,画面正常,但是如果使用小流查看美颜画面,视频画面中会偶尔闪烁黑块,类似于大块马赛克效果,然后进行分析,如果将美颜效果关闭,小流视频画面正常,视频处理流程:将采集到的视频画面,进行YUV或者RGB美颜渲染处理,然后将画面帧传递给WebRTC进行编码,最后上行给服务器,下发给远端观看。
猜测,既然关闭美颜画面,小流画面没有问题,那么有可能是美颜处理出现的问题,于是,将美颜相关的代码进行注释,发现画面黑屏,但是依然有黑块闪动,所以大概率不是美颜处理造成的问题。
继续分析代码,发现先美颜,后编码的过程中,都是处理的同一个地址的视频帧数据,但是美颜和编码是在两个不同的异步线程进行处理,这就会导致,编码处理的数据和美颜处理的数据不一致,因为美颜会改变YUV数据,所以有可能小流时造成黑块闪动问题。于是添加了一个copy视频数据的方法,使编码处理的数据和美颜处理的数据保持一致,然后检测发现小流不再闪动,问题解决了(无比开心!无比激动!)。
copy视频数据地址的方法
/// RGB/BGR buffer copy
+ (CVPixelBufferRef)RGBBuffereCopyWithPixelBuffer:(CVPixelBufferRef)pixelBuffer {
// Get pixel buffer info
CVPixelBufferLockBaseAddress(pixelBuffer, 0);
int bufferWidth = (int)CVPixelBufferGetWidth(pixelBuffer);
int bufferHeight = (int)CVPixelBufferGetHeight(pixelBuffer);
size_t bytesPerRow = CVPixelBufferGetBytesPerRow(pixelBuffer);
uint8_t *baseAddress = CVPixelBufferGetBaseAddress(pixelBuffer);
OSType pixelFormat = kCVPixelFormatType_32BGRA;
// Copy the pixel buffer
CVPixelBufferRef pixelBufferCopy = NULL;
CFDictionaryRef empty = CFDictionaryCreate(kCFAllocatorDefault, NULL, NULL, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); // our empty IOSur