视频前处理是介于采集和编码之间的一个流程,开发者自行采集视频数据或获取到 SDK 采集的视频数据后,若 ZEGO Express SDK 自带的基础美颜和水印功能无法满足开发者需求时(例如美颜效果无法达到预期),可以通过 ZEGO Effects SDK 对视频进行一些特殊处理,例如美颜、添加挂件等,该过程即为自定义视频前处理。
自定义视频前处理相比于自定义视频采集功能的优势在于无需开发者管理设备输入源,仅需对 ZEGO Express SDK 抛出来的原始数据进行操作,然后发回 ZEGO Express SDK 即可。
对于比较复杂的场景,例如想通过摄像头画面做图层混合,建议开发者使用 自定义视频采集 功能实现,该方式性能优化的空间更大。
ZEGO 提供实现美颜功能的示例源码,请参考 实时音视频和AI视觉的搭配使用。
在进行自定义视频前处理前,请确保:
SDK 支持的视频前处理 Buffer 类型如下:
Buffer 类型 | 枚举值 | 说明 |
---|---|---|
GLTexture2D | ZegoVideoBufferType.GL_TEXTURE_2D | 表示 Texture 纹理类型的原始视频数据。 |
SurfaceTexture | ZegoVideoBufferType.SURFACE_TEXTURE | 表示 SurfaceTexture 类型的原始视频数据。 |
下文以 “ZegoVideoBufferType.GL_TEXTURE_2D” 为例演示自定义视频前处理的用法。
自定义视频前处理的时序图如下:
关键流程如下:
创建自定义视频前处理 ZegoCustomVideoProcessConfig 对象,设置 bufferType 属性,用于向 Express SDK 提供视频帧数据类型。
由于 Android 视频数据类型的多样性,SDK 支持多种视频帧数据类型 bufferType ,开发者需告知 SDK 使用的数据类型。目前 SDK 支持如下两种数据类型,设置其他枚举值将无法正常使用:
在开始预览和开始推流前调用 enableCustomVideoProcessing 接口开启自定义视频前处理功能。
ZegoCustomVideoProcessConfig config = new ZegoCustomVideoProcessConfig();
// 选择 GL_TEXTURE_2D 类型视频帧数据
config.bufferType = ZegoVideoBufferType.GL_TEXTURE_2D;
// 开启自定义前处理
express.enableCustomVideoProcessing(true, config, ZegoPublishChannel.MAIN);
当 SDK 获取到原始视频数据后,会通过 onCapturedUnprocessedTextureData 方法通知开发者,此后开发者即可调用 ZEGO Effects SDK 进行视频处理。
如下示例代码片段仅展示关键调用步骤。
// 回调方法获取原始数据
// 回调处理
express.setCustomVideoProcessHandler(new IZegoCustomVideoProcessHandler() {
...
// 从 ZegoExpressEngine 引擎接收 Texture
@Override
public void onCapturedUnprocessedTextureData(int textureID, int width, int height, long referenceTimeMillisecond, ZegoPublishChannel channel) {
ZegoEffectsVideoFrameParam param = new ZegoEffectsVideoFrameParam();
param.format = ZegoEffectsVideoFrameFormat.BGRA32;
param.width = width;
param.height = height;
// 自定义前处理:此处使用 Effects SDK
int processedTextureID = effects.processTexture(textureID, param);
// 将处理后的 buffer 发回 Express SDK 里
express.sendCustomVideoProcessedTextureData(processedTextureID, width, height, referenceTimeMillisecond);
}
}
联系我们
文档反馈