乐趣区

关于虚拟现实:用-ZEGO-Avatar-做一个虚拟人|虚拟主播直播解决方案

虚构直播既能够实现单人视频直播,也能够邀请观众上麦、与虚构主播进行多人连麦互动。

虚构直播场景架构设计

虚构直播场景的次要架构如下图所示(以多人连麦直播互动为例):

虚拟人直播体验 App 源码

ZEGO 针对虚构直播提供了 体验 App 源码,以供开发者进一步理解 ZEGO 虚构直播计划。

前提条件

  • 已在我的项目中集成 ZEGO Express SDK,详情请参考 实时音视频 – 疾速开始 – 集成 SDK。
  • 已在我的项目中集成 ZEGO Avatar SDK,详情请参考 Avatar 虚构形象 – 疾速开始 – 集成 SDK。
  • 已在 ZEGO 控制台 创立我的项目,并申请无效的 AppID 和 AppSign,详情请参考 控制台 – 项目管理 中的“我的项目信息”。

虚构直播实现流程

虚构直播场景的整体流程如下:

  1. 虚构主播进入房间后,给 ZEGO Avatar 设置虚构形象,开始采集 ZEGO Avatar 纹理内容,并进行预览并推流。
  2. 观众进入房间后,给 ZEGO Avatar 设置虚构形象,并进行拉流。
  3. 主播、观众均通过信令模块进行连贯,信令模块能够管制以后业务房间内的直播流程,同步并告诉各端以后的直播状态。
  4. 无论是否有连麦观众, 主播和观众均通过 ZEGO 音视频云服务进行推拉流。
  5. 观众申请与主播连麦后,信令模块会告诉主播,并同步连麦者的个人信息。
  6. 主播承受连麦申请后,连麦观众开始采集 Avatar 纹理内容并推流,房间内所有成员将会接管到流更新告诉,并拉取连麦观众的音视频流。
  7. 若连麦观众不再须要连麦,则向业务后盾发动下麦申请。收到信令模块的下麦告诉后,连麦观众进行推流、进行采集 Avatar 纹理内容、进行表情随动,主播和房间内的其余观众进行拉取该观众的流。

虚拟人直播具体流程图如下:

1 开明 虚构形象 Avatar 服务

请分割 ZEGO 商务人员为 AppID 开明 Avatar 服务,以便创立虚构形象。

2 初始化即构实时音视频 ZEGO Express Video SDK

在应用 Express Video SDK 进行视频通话之前,须要初始化 SDK。因为初始化操作 SDK 时,外部解决的操作较多,倡议开发者在 App 启动时进行。

/** 定义 SDK 引擎对象 */
ZegoExpressEngine engine;

ZegoEngineProfile profile = new ZegoEngineProfile();
/** 请通过 ZEGO 控制台获取,格局为 123456789L */
profile.appID = appID;
/** 64 个字符,请通过 ZEGO 控制台获取,格局为 "0123456789012345678901234567890123456789012345678901234567890123" */
profile.appSign = appSign;
/** 通用场景接入 */
profile.scenario = ZegoScenario.GENERAL;
/** 设置 app 的 application 对象 */
profile.application = getApplication();
/** 创立引擎 */
engine = ZegoExpressEngine.createEngine(profile, null);

在初始化 Express Video SDK 的时候须要开明 RTC 的自定义采集,Avatar 形象是通过自定义采集推送纹理。因为 Avatar 的数据是相同方向的,所以在初始化的时候须要设置镜像。

// 设置本地预览和拉流端看到的视频都是镜像画面。(Avatar 推送的镜像相同)engine.setVideoMirrorMode(ZegoVideoMirrorMode.BOTH_MIRROR);
ZegoCustomVideoCaptureConfig videoCaptureConfig = new ZegoCustomVideoCaptureConfig();
// 设置自定义视频采集视频帧数据类型为 GL_TEXTURE_2D 类型
videoCaptureConfig.bufferType = ZegoVideoBufferType.GL_TEXTURE_2D;
engine.enableCustomVideoCapture(true, videoCaptureConfig, ZegoPublishChannel.MAIN);

更多初始化 Express Video SDK 的细节请参考:实时音视频 – 疾速开始 – 实现视频通话 的“3.1 创立引擎”。

3 创立虚构形象

在应用虚构直播前,创立本人的集体形象。详情请参考 创立虚构形象。

4 虚拟人登录直播房间

主播开始直播或观众观看直播前,须要先登录到直播房间。在收到登录房间胜利的回调后,能够间接调用 Express Video SDK 的接口进行推拉流操作。

/** 创立用户 */
ZegoUser user = new ZegoUser("Anchor");

/** 开始登录房间 */
engine.loginRoom("MetaLive", user);

更多应用 Express Video SDK 实现登录直播房间的细节请参考:实时音视频 – 疾速开始 – 实现视频通话 的“3.2 登录房间”。

5 设置集体虚构形象

初始化 ZegoCharacterHelper 类,设置曾经创立的集体的虚构形象,用于直播的集体形象展现。


//mZegoInteractEngine 的初始化
if (mZegoInteractEngine == null) {mZegoInteractEngine = ZegoAvatarService.getInteractEngine();
}

// 初始化 ZegoCharacterHelper 类
if (mCharacterHelper == null) {mCharacterHelper = new ZegoCharacterHelper(AvatarDataUtil.getResourcePath(context));
   mCharacterHelper.setExtendPackagePath(AvatarDataUtil.getPackagesPath(context));
}

// 默认半身,先把动画敞开
cameraViewState = ZegoAvatarViewState.half;
setBodyState(cameraViewState, false);

// 获取默认虚构形象数据
String jsonDefaultStr = AvatarDefaultJson.getDefaultAvatarJson(isBoy,AvatarDefaultJson.isHead);
//isBoy 为 true 是男生
if (isBoy) {
   // 获取已创立男生的虚构形象
   String jsonMaleStr = AvatarJsonMgr.getMaleJsonData(context);
   // 男生数据为空的状况就设置为默认形象
   mCharacterHelper.setAvatarJson(!TextUtils.isEmpty(jsonMaleStr) ? jsonMaleStr : jsonDefaultStr);
} else {
  // 获取已创立女生的虚构形象
  String jsonFemaleStr = AvatarJsonMgr.getFemaleJsonData(context);
  // 女生数据为空的状况就设置为默认形象
  mCharacterHelper.setAvatarJson(!TextUtils.isEmpty(jsonFemaleStr) ? jsonFemaleStr : jsonDefaultStr);
}

6 单虚构主播直播

6.1 获取 ZEGO Avatar 的纹理内容

Avatar 的虚构形象数据是通过 startCaptureAvatar 回调到下层通过自定义采集推送进来。因为 Avatar 数据是通明背景,RTC 是没背景的,转换的时候默认彩色,开发者能够自行将背景设置为须要的色彩。

// 依据理论需要设置 Avatar 返回内容的宽(width)和高(height)AvatarCaptureConfig config = new AvatarCaptureConfig(width, height);
        // 开始采集获取 Avatar 纹理
        mCharacterHelper.startCaptureAvatar(config, new OnAvatarCaptureCallback() {
            @Override
            public void onAvatarTextureAvailable(int textureID, int width, int height) {
                // 背景色彩设置为 true 才失效
                boolean useFBO = true;
                if(mBgRender == null){mBgRender = new TextureBgRender(textureID, useFBO, width, height, Texture2dProgram.ProgramType.TEXTURE_2D_BG);
                }
                if(mBgRender != null){mBgRender.setInputTexture(textureID);
                    // 用户须要批改成所须要的色彩值(RGB)mBgRender.setBgColor(rColor, gColor, bColor, 1.0f);
                    mBgRender.draw(true);
                }
                // 通过 RTC SDK 的自定义采集 sendCustomVideoCaptureTextureData 进行推送数据
                engine.sendCustomVideoCaptureTextureData(mBgRender.getOutputTextureID(), width, height, System.currentTimeMillis());
            }
        });

6.2 虚构主播开启预览并推流

主播向 ZEGO 音视频云服务推流,须要本人生成惟一的 StreamID,而后开始预览并推流。

// 开启预览
engine.startPreview(new ZegoCanvas(preview_view));

// 推流
engine.startPublishingStream("Anchor");

更多应用 Express Video SDK 实现预览和推流的细节请参考:实时音视频 – 疾速开始 – 实现视频通话 的“3.3 推流”。

6.3 观众拉流

观众进入房间后,会收到 Express Video SDK 的流更新告诉,从中筛选出主播流的 StreamID 进行拉流。

// 观众拉流
ZegoCanvas zegoCanvas = new ZegoCanvas(view);
zegoCanvas.viewMode = ZegoViewMode.ASPECT_FILL;
engine.startPlayingStream("Anchor",zegoCanvas);

更多应用 Express Video SDK 实现拉流的细节请参考:实时音视频 – 疾速开始 – 实现视频通话 的“3.4 拉流”。

7 观众与虚构主播连麦

7.1 虚拟人连麦观众推流

观众调用业务后盾申请连麦接口,调用胜利后,业务后盾向主播发送申请连麦自定义信令。主播收到信令后,调用业务后盾批准连麦接口,调用胜利后,业务后盾向房间内所有成员发送连麦胜利的播送信令,连麦观众收到信令后,开始推流,观众下台后也是依照 6.1 获取 Avatar 的纹理内容 的流程,把 Avatar 的内容通过自定义采集推流出去。

// 连麦观众推流
engine.startPublishingStream("Audience1");

7.2 虚构主播拉流

连麦观众推流后,房间内所有成员会收到 Express Video SDK 的流更新告诉,主播获取连麦观众流的 StreamID 进行拉流。

房间内其余观众也在收到流更新回调时,获取连麦观众流的 StreamID 进行拉流。

// 主播拉流 
ZegoCanvas zegoCanvas = new ZegoCanvas(view);
zegoCanvas.viewMode = ZegoViewMode.ASPECT_FILL;
engine.startPlayingStream("Audience1",zegoCanvas);

7.3 虚拟人连麦观众下麦

连麦观众调用业务后盾的下麦接口,调用胜利后,业务后盾向房间内所有成员发送该观众下麦的播送信令。连麦观众收到信令后进行推流、进行采集获取 Avatar 纹理内容、进行表情随动检测,房间内其余观众收到信令后进行拉流。

// 连麦观众进行预览和完结推流
engine.stopPreview();
engine.stopPublishingStream();
// 房间内其余成员完结拉流 
engine.stopPlayingStream("Audience1");
// 进行采集获取 Avatar 纹理
public void stopCaptureAvatar() {if (mCharacterHelper != null) {mCharacterHelper.stopCaptureAvatar();
        }
}
// 进行表情随动
public void stopDetectExpression() {if (mZegoInteractEngine != null && mZegoInteractEngine.isStarted()) {mZegoInteractEngine.stopDetectExpression();
        }
}

更多应用 Express Video SDK 实现进行推拉流的细节请参考:实时音视频 – 疾速开始 – 实现流程 的“4.2 进行推拉流”。

7 获取更多帮忙 - 即构虚构主播解决方案

虚构直播场景为元宇宙社交娱乐模式下的全新直播形式,虚构形象代替真人出镜,打造不一样的直播体验,反对表情随动、手势辨认触发特效等多种玩法;同时场景反对多位虚构形象视频连麦互动,更容易吸引用户参加连麦互动,晋升用户的生产志愿及粘性。获取更多虚构直播文档

七周年福利:提交表单分割商务,有机会获取即构 ZEGO Avatar 虚构形象 1 个月收费试用。

退出移动版