WebRTC音视频之美颜开启后小流闪烁问题

美颜开启后,打开双流,远端查看小流时,小流闪烁问题

项目中使用的是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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hbblzjy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值