对接第三方插件
提示
在基于 SDK 建立通话基础上,使用 GPUImage 库可以实现本地视频滤镜和水印等视频纹理的渲染处理。
SDK 5.2.3 及以上版本
在 RCRTCCameraOutputStream 的父类 RCRTCVideoOutputStream 中的属性 streamEventDelegate 的 outputVideoStream: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;
参数说明
| 参数 | 类型 | 是否必填 | 说明 |
|---|---|---|---|
| stream | RCRTCVideoOutputStream * | 是 | 采集的视频帧数据所属接收到的 流 |
| videoFrame | RCRTCVideoFrame * | 否 | 采集的视频数据,类型为 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 会作用于本地视频显示和发送的视频数据。
设置视频处理回调
接口原型
Objective C
@property (nonatomic, copy, nullable) RCRTCVideoCMSampleBufferCallback videoSendBufferCallback;
属性说明
| 属性 | 类型 | 说明 |
|---|---|---|
| videoSendBufferCallback | RCRTCVideoCMSampleBufferCallback | 视频编码并发送之前的回调,您可以修改和调整 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) 对象,上层不需要再考虑释放问题。