用 ZEGO Avatar 做一个虚拟人|虚拟主播直播解决方案
虚拟直播既可以实现单人视频直播,也可以邀请观众上麦、与虚拟主播进行多人连麦互动。
虚拟直播场景架构设计
虚拟直播场景的主要架构如下图所示(以多人连麦直播互动为例):

虚拟人直播体验 App 源码
ZEGO 针对虚拟直播提供了 体验 App 源码,以供开发者进一步了解 ZEGO 虚拟直播方案。
前提条件
- 已在项目中集成 ZEGO Express SDK,详情请参考 实时音视频 - 快速开始 - 集成 SDK。
- 已在项目中集成 ZEGO Avatar SDK,详情请参考 Avatar 虚拟形象 - 快速开始 - 集成 SDK。
- 已在 ZEGO 控制台 创建项目,并申请有效的 AppID 和 AppSign,详情请参考 控制台 - 项目管理 中的“项目信息”。
虚拟直播实现流程
虚拟直播场景的整体流程如下:
- 虚拟主播进入房间后,给 ZEGO Avatar 设置虚拟形象,开始采集 ZEGO Avatar 纹理内容,并进行预览并推流。
- 观众进入房间后,给 ZEGO Avatar 设置虚拟形象,并进行拉流。
- 主播、观众均通过信令模块进行连接,信令模块可以控制当前业务房间内的直播流程,同步并通知各端当前的直播状态。
- 无论是否有连麦观众, 主播和观众均通过 ZEGO 音视频云服务进行推拉流。
- 观众请求与主播连麦后,信令模块会通知主播,并同步连麦者的个人信息。
- 主播接受连麦申请后,连麦观众开始采集 Avatar 纹理内容并推流,房间内所有成员将会接收到流更新通知,并拉取连麦观众的音视频流。
- 若连麦观众不再需要连麦,则向业务后台发起下麦请求。收到信令模块的下麦通知后,连麦观众停止推流、停止采集 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个月免费试用。
用 ZEGO Avatar 做一个虚拟人|虚拟主播直播解决方案的更多相关文章
- E时代主机,其实做一个小虚拟主机还是不错的
http://www.idcen.com/ 做微信没有网上测试地址,找了一下发现以前用过的.记录一下.一个100m的虚拟主机需要三四十块钱,做微信,做一个小型网站还是够用的,就是mysql有点问题,不 ...
- jquery做一个小的轮播插件---有BUG,后续修改
//首页无缝轮播 ; (function($, window, document, undefined) { $.fn.slider = function(options) { var default ...
- 虎牙数万主播同时在线直播的秘密,CDN推流日志上行实时监控
6 月 10 日,又拍云 Open Talk | 2018 音视频技术沙龙·深圳站 顺利落幕,来自虎牙的直播运维研发架构师张波在沙龙上做了<基于CDN推流日志的主播上行实时监控及其自动化解密&g ...
- 鹅厂优文|主播pk,如何实现无缝切换?
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文作者,rexchang(常青),腾讯视频云终端技术总监,2008 年毕业加入腾讯,一直从事客户端研发相关工作,先后参与过 PC QQ.手 ...
- 微软云创益大赛获奖团队风采:做一个中国特色的.Net源代码社区
为了强化云技术,落地云应用,彰显云价值,微软(中国)携手中国计算机报举办了“微软Cloud OS第二届云创益大赛”.本届大赛历时111天,共吸引了6647位个人组选手回答了70,078道题,59支参赛 ...
- 【Bugly干货分享】一起用 HTML5 Canvas 做一个简单又骚气的粒子引擎
Bugly 技术干货系列内容主要涉及移动开发方向,是由Bugly邀请腾讯内部各位技术大咖,通过日常工作经验的总结以及感悟撰写而成,内容均属原创,转载请标明出处. 前言 好吧,说是“粒子引擎”还是大言不 ...
- 做一个会PS切图的前端开发
系列链接 做一个会使用PS的前端开发 做一个会PS切图的前端开发 切图方法分类 PhotoShop从CS版本演变到现在的CC版本,切图功能发生了比较大的变化,我们可以把PhotoShop CS版本时的 ...
- NanUI for Winform 使用示例【第二集】——做一个所见即所得的Markdown编辑器
经过了这一个多星期的调整与修复,NanUI for .NET Winform的稳定版已经发布.应广大群友的要求,现已将NanUI的全部代码开源. GitHub: https://github.com/ ...
- 使用plupload做一个类似qq邮箱附件上传的效果
公司项目中使用的框架是springmvc+hibernate+spring,目前需要做一个类似qq邮箱附件上传的功能,暂时只是上传小类型的附件 处理过程和解决方案都需要添加附件,处理过程和解决方案都可 ...
- 一起用HTML5 canvas做一个简单又骚气的粒子引擎
前言 好吧,说是"粒子引擎"还是大言不惭而标题党了,离真正的粒子引擎还有点远.废话少说,先看demo 本文将教会你做一个简单的canvas粒子制造器(下称引擎). 世界观 这个简单 ...
随机推荐
- codeup之剩下的树
Description 有一个长度为整数L(1<=L<=10000)的马路,可以想象成数轴上长度为L的一个线段,起点是坐标原点,在每个整数坐标点有一棵树,即在0,1,2,-,L共L+1个位 ...
- JS/Jquery检查网络路径文件是否存在
var url='网络文件路径'; var isExists; $.ajax(url, { type: 'HEAD', dataType: 'text', async: false, success: ...
- GLSL的预处理器都有哪些规定?
GLSL的预处理器都有哪些规定? 下面的内容,英文版取自GLSLangSpec.4.60.pdf,中文版是我的翻译,只求意译准确易懂,不求直译严格匹配. 3.3. Preprocessor There ...
- 双 CDN 加速 + 智能调度
转载自我的个人博客:双 CDN 加速 + 智能调度 |未名小站 DeepSeek 的官网是一个很典型的双 CDN 加速的场景,当我们使用 IT-Dog 对其发起多地 Ping 的时候,可以看到国内使用 ...
- python之package定义
一.简单说明 python是通过module组织代码的,每一个module就是一个python文件,但是modules是通过package来组织的.我们平时在简单测试的时候 一般就是几个Python文 ...
- ChatMoney智能知识库让你轻松工作!
本文由 ChatMoney团队出品 为了增强企业内部知识的传递和共享效率,最近花了两周时间测试Chatmoney知识库 +企微客服助手模式,测试效果让我很惊喜! 对话引用知识库内容,Chatmoney ...
- linux环境下的redis安装
选择一个安装目录 cd /usr/src/redis/ 下载redis,下载路径的版本号可以改 wget https://download.redis.io/releases/redis-3.2.0. ...
- Hyper loglog 简单理解
最近在学习redis, 看到hyper loglog 有这么近乎作弊的空间复杂度 着实好奇 其核心使用了概率统计 通过局部判断总体 loglog 我们的任务是基数统计 判断不重复子串数量 字串由0/1 ...
- Ubuntu云服务器上部署发布Vite项目
1 拷贝代码 一般来说是Windows环境下开发,Ubuntu环境下部署.因此首先要考虑的问题是如何将Vite项目的源代码拷贝到云服务器上面去.最简单的就是使用像MobaXterm这样的远程连接工具, ...
- Axios 简单使用
axios({ method: "post", headers: { "Content-Type": "application/json" ...