跳到主要内容

对接第三方插件

提示

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

对接三方插件(实现美颜、水印)(≧ 5.2.3)

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

  1. 设置代理。

    [RCRTCEngine sharedInstance].defaultVideoStream.streamEventDelegate = self;
  2. outputVideoStream:captureVideoFrame: 方法中对该视频帧的内存数据 pixelBuffer 进行美颜、水印处理。

    /*!
    采集视频数据回调

    @param videoFrame 采集的视频数据
    @param stream 采集的视频帧数据所属接收到的流
    @discussion
    采集的视频数据,如果修改该视频帧,会影响本地渲染和编码发送的视频帧数据,不支持修改数据格式

    @remarks 代理
    added from 5.2.3
    */
    - (void)outputVideoStream:(RCRTCVideoOutputStream *)stream captureVideoFrame:(nullable RCRTCVideoFrame *)videoFrame {
    //美颜、水印处理 videoFrame 中的 pixelBuffer
    }
    输入参数类型说明
    streamRCRTCVideoOutputStream当前流对象
    videoFrameRCRTCVideoFrame *当前采集的视频帧

对接三方插件(实现美颜、水印)(< 5.2.3)

RCRTCCameraOutputStream 类中的 videoSendBufferCallback 中,处理后同步返回的视频 CMSampleBufferRef 会作用于本地视频显示和发送的视频数据。如果用户传正常数据,则内部会自行释放 CFRelease(CMSampleBufferRef) 对象,上层不需要再考虑释放问题。

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

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

输入参数

参数类型说明
videoSendBufferCallbackRCRTCVideoCMSampleBufferCallback引擎底部开始视频编码并发送之前会往上层抛一个回调,用户可以修改和调整 CMSampleBufferRef 数据,然后返回一个 CMSampleBufferRef 数据,实现美颜与水印效果。如果返回空或者没有实现该回调,则会使用默认视频数据传输

示例代码

[RCRTCEngine sharedInstance].defaultVideoStream.videoSendBufferCallback =
^CMSampleBufferRef _Nullable(BOOL valid, CMSampleBufferRef _Nullable sampleBuffer) {
if ( !strongSelf.openBeauty&&!strongSelf.openWaterMark ) {
return sampleBuffer;
}
// 返回处理后的 CMSampleBufferRef 数据
CMSampleBufferRef processedSampleBuffer = [strongSelf.gpuImageHandler onGPUFilterSource:sampleBuffer];
return processedSampleBuffer ?: sampleBuffer;
};