跳到主要内容

对接第三方插件

提示

在基于 SDK 建立通话基础上,使用 GPUImage 库可以实现本地视频滤镜和水印等视频纹理的渲染处理。

SDK 5.2.3 及以上版本

RCRTCCameraOutputStream 的父类 RCRTCVideoOutputStream 中的属性 streamEventDelegateoutputVideoStream:captureVideoFrame: 方法,会同步返回采集的视频帧 RCRTCVideoFrame,您可以直接对该视频帧的内存数据 pixelBuffer 进行美颜、水印处理。

实现流程

1. 设置代理

Objective C
#import <RongRTCLib/RongRTCLib.h>

[RCRTCEngine sharedInstance].defaultVideoStream.streamEventDelegate = self;

2. 实现视频采集代理方法

接口原型
Objective C
- (void)outputVideoStream:(RCRTCVideoOutputStream *)stream captureVideoFrame:(nullable RCRTCVideoFrame *)videoFrame;
参数说明
参数类型是否必填说明
streamRCRTCVideoOutputStream *采集的视频帧数据所属接收到的流
videoFrameRCRTCVideoFrame *采集的视频数据,类型为 RCRTCVideoFrameFormatNV12
代码示例
Objective C
#import <RongRTCLib/RongRTCLib.h>

// 实现视频采集代理方法
- (void)outputVideoStream:(RCRTCVideoOutputStream *)stream captureVideoFrame:(nullable RCRTCVideoFrame *)videoFrame {
if (videoFrame && videoFrame.pixelBuffer) {
// 对 videoFrame 中的 pixelBuffer 进行美颜、水印处理
// 注意:修改该视频帧会影响本地渲染和编码发送的视频帧数据,不支持修改数据格式
}
}
提示
  • 采集的视频数据,如果修改该视频帧,会影响本地渲染和编码发送的视频帧数据
  • 不支持修改数据格式
  • 此功能从 5.2.3 版本开始支持

SDK 5.2.3 以下版本

RCRTCCameraOutputStream 类中的 videoSendBufferCallback 中,处理后同步返回的视频 CMSampleBufferRef 会作用于本地视频显示和发送的视频数据。

提示

参考 RTC Quick DemoGitHub · Gitee)下 /RCRTCQuickDemo/Living/GPUImage/GPUImageHandle.m 对美颜的处理。

设置视频处理回调

接口原型

Objective C
@property (nonatomic, copy, nullable) RCRTCVideoCMSampleBufferCallback videoSendBufferCallback;

属性说明

属性类型说明
videoSendBufferCallbackRCRTCVideoCMSampleBufferCallback视频编码并发送之前的回调,您可以修改和调整 CMSampleBufferRef 数据,然后返回一个 CMSampleBufferRef 数据,实现美颜与水印效果。如果返回空或者没有实现该回调,则会使用默认视频数据传输

回调类型定义

Objective C
typedef CMSampleBufferRef _Nullable (^RCRTCVideoCMSampleBufferCallback)(BOOL valid, CMSampleBufferRef _Nullable sampleBuffer);

代码示例

Objective C
#import <RongRTCLib/RongRTCLib.h>

[RCRTCEngine sharedInstance].defaultVideoStream.videoSendBufferCallback =
^CMSampleBufferRef _Nullable(BOOL valid, CMSampleBufferRef _Nullable sampleBuffer) {
// 如果未开启美颜和水印,直接返回原始数据
if (!strongSelf.openBeauty && !strongSelf.openWaterMark) {
return sampleBuffer;
}

// 使用 GPUImage 处理视频数据
CMSampleBufferRef processedSampleBuffer = [strongSelf.gpuImageHandler onGPUFilterSource:sampleBuffer];
return processedSampleBuffer ?: sampleBuffer;
};
提示

如果您传入正常数据,SDK 内部会自行释放 CFRelease(CMSampleBufferRef) 对象,上层不需要再考虑释放问题。