实时音视频
  • iOS
  • Android : Java
  • macOS
  • Windows
  • HarmonyOS
  • Linux
  • Web
  • 小程序
  • Flutter
  • Electron
  • Unreal Engine
  • Unity3D
  • uni-app
  • React Native
  • Cocos Creator
  • 产品简介
  • 下载
  • 体验 App
  • 快速开始
    • 跑通示例源码
    • 集成 SDK
    • 实现视频通话
    • 实时音视频 SDK 与实时语音 SDK 差异
    • 场景化音视频配置
  • 基础功能
  • 进阶功能
  • 最佳实践
  • 常见错误码
  • 服务端 API
  • 客户端 API
  • 常见问题

自定义视频前处理

更新时间:2023-09-26 17:41

功能简介

视频前处理是介于采集和编码之间的一个流程,开发者自行采集视频数据或获取到 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” 为例演示自定义视频前处理的用法。

自定义视频前处理的时序图如下:

关键流程如下:

  1. 初始化 Express SDK 和 Effects SDK,针对两个 SDK 的初始化,不做时序上的限制。
  2. 开启自定义视频前处理功能。
  3. 设置自定义视频前处理回调对象并实现对应方法。
  4. 登录房间,调用本地视频预览或推流。再将收到自定义视频前处理回调通知,获取原始视频数据。
  5. 调用 Effects SDK 进行视频处理。
  6. 处理完成后,需在同一回调内调用发送视频帧方法向 Express SDK 提供处理后的视频帧数据。
  7. 结束本地视频预览和推流
  8. 登出房间,销毁 Express SDK 和 Effects SDK。

1 开启自定义视频前处理功能

创建自定义视频前处理 ZegoCustomVideoProcessConfig 对象,设置 bufferType 属性,用于向 Express SDK 提供视频帧数据类型。

由于 Android 视频数据类型的多样性,SDK 支持多种视频帧数据类型 bufferType ,开发者需告知 SDK 使用的数据类型。目前 SDK 支持如下两种数据类型,设置其他枚举值将无法正常使用:

  • SurfaceTexture 类型:即 bufferType 取值为 “ZegoVideoBufferType.SURFACE_TEXTURE”。
  • GLTexture2D 类型:即 bufferType 取值为 “ZegoVideoBufferType.GL_TEXTURE_2D”。

在开始预览和开始推流前调用 enableCustomVideoProcessing 接口开启自定义视频前处理功能。

ZegoCustomVideoProcessConfig config = new ZegoCustomVideoProcessConfig();
// 选择 GL_TEXTURE_2D 类型视频帧数据
config.bufferType = ZegoVideoBufferType.GL_TEXTURE_2D;

// 开启自定义前处理
express.enableCustomVideoProcessing(true, config, ZegoPublishChannel.MAIN);

2 获取原始视频数据,进行美颜处理

当 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);
    }
}
本篇目录