虚拟直播实现流程(多人连麦直播互动为例)
虚拟直播既可以实现单人视频直播,也可以邀请观众上麦、进行多人连麦互动。
虚拟直播场景的直播分为两个阶段:
- 单虚拟主播直播:
单虚拟主播直播是指主播创建房间后,使用虚拟形象进行音视频直播,观众可以进房观看直播。
主播使用Zego Avatar SDK
设置虚拟形象,随后采集 Avatar 纹理,使用Express Video SDK
或其他三方推流工具推流到 CDN,观众通过Express Video SDK
或其他三方播放器拉取主播视频流观看直播。 - 多人虚拟连麦直播:
多人虚拟连麦直播是指主播创建房间后,使用虚拟形象进行音视频直播,观众可以进房申请连麦,上麦后也使用虚拟形象进行互动,适用于一对多视频互动的虚拟直播场景。
主播与连麦者(主播或观众)使用Express Video SDK
登录直播房间,使用Zego Avatar SDK
设置虚拟形象,随后采集 Avatar 纹理,进行互动连麦,视频流推流到 ZEGO 服务器。观众同时拉取主播和连麦者的音视频流观看。
虚拟直播架构设计
虚拟直播场景的主要架构如下图所示(以多人连麦直播互动为例):
前提条件
- 已在 ZEGO 控制台 创建项目,并申请有效的 AppID 和 AppSign,详情请参考 控制台 – 项目管理 中的“项目信息”。
- 已在项目中集成 ZEGO Express SDK,详情请参考 实时音视频 – 快速开始 – 集成 SDK。
- 已在项目中集成 ZEGO Avatar SDK,详情请参考 Avatar 虚拟形象 – 快速开始 – 集成 SDK。
- 请联系 ZEGO 技术支持,提供申请到的 AppID,以及自己项目的包名 applicationId,以开通 Avatar 服务。
实现流程
虚拟直播场景的整体流程如下:
- 主播进入房间后,给 Avatar 设置虚拟形象,开始采集 Avatar 纹理内容,并进行预览并推流。
- 观众进入房间后,给 Avatar 设置虚拟形象,并进行拉流。
- 主播、观众均通过信令模块进行连接,信令模块可以控制当前业务房间内的直播流程,同步并通知各端当前的直播状态。
- 无论是否有连麦观众, 主播和观众均通过 ZEGO 音视频云服务进行推拉流。
- 观众请求与主播连麦后,信令模块会通知主播,并同步连麦者的个人信息。
- 主播接受连麦申请后,连麦观众开始采集 Avatar 纹理内容并推流,房间内所有成员将会接收到流更新通知,并拉取连麦观众的音视频流。
- 若连麦观众不再需要连麦,则向业务后台发起下麦请求。收到信令模块的下麦通知后,连麦观众停止推流、停止采集 Avatar 纹理内容、停止表情随动,主播和房间内的其他观众停止拉取该观众的流。
详细流程图如下:
1 开通 Avatar 服务
请联系 ZEGO 商务人员为 AppID 开通 Avatar 服务,以便创建虚拟形象。
2 初始化 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);
3 创建虚拟形象
在使用虚拟直播前,创建自己的个人形象。详情请参考 创建虚拟形象。
4 登录直播房间
主播开始直播或观众观看直播前,需要先登录到直播房间。在收到登录房间成功的回调后,可以直接调用 Express Video SDK 的接口进行推拉流操作。
/** 创建用户 */
ZegoUser user = new ZegoUser("Anchor");/** 开始登录房间 */
engine.loginRoom("MetaLive", user);
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 获取 Avatar 的纹理内容
Avatar 的虚拟形象数据是通过 startCaptureAvatar 回调到上层通过自定义采集推送出去。由于 Avatar 数据是透明背景,RTC是没背景的,转换的时候默认黑色,开发者可以自行将背景设置为需要的颜色。
//根据实际需求设置 Avatar 返回内容的宽(width)和高(height)
AvatarCaptureConfig config = new AvatarCaptureConfig(width, height);//开始采集获取 Avatar 纹理mCharacterHelper.startCaptureAvatar(config, new OnAvatarCaptureCallback() {@Overridepublic 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");
6.3 观众拉流
观众进入房间后,会收到 Express Video SDK 的流更新通知,从中筛选出主播流的 StreamID 进行拉流。
// 观众拉流
ZegoCanvas zegoCanvas = new ZegoCanvas(view);
zegoCanvas.viewMode = ZegoViewMode.ASPECT_FILL;
engine.startPlayingStream("Anchor",zegoCanvas);
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();}
}
进阶功能
形象切换
设置 RTC 视频采集源
当开发者需要从 Avatar 虚拟形象切换到真人形象或者从真人形象切换到 Avatar 虚拟形象的时候,均需要调用 Express SDK 的 callExperimentalAPI设置 RTC 视频采集源。
public static final int VIDEO_SRC_DEFAULT = 0; // 默认视频源
private static final int VIDEO_SRC_CAMERA = 2; // 摄像头视频源,在该场景中特指真人画面
private static final int VIDEO_SRC_EXTERNAL_CAPTURE = 3; // 外部视频源,在该场景中特指虚拟形象private static final String VIDEO_REAL_AVATAR_METHOD = "express.video.set_video_source"; // 切换视频源,用来实现真人形象和虚拟形象之间的互相切换// 当从 Avatar 虚拟形象切换到真人或者从真人切换到 Avatar 虚拟形象之前,需要对 callExperimentalAPI 传入如下格式的 JSON 数据,设置视频采集源:
// 开发者仅需要修改 source,传入 2 或 3 即可。
String requireJson = "{"method":"express.video.set_video_source","params":{"channel":0,"source":2}}"// 调用 callExperimentalAPI 接口设置视频采集源
engine.callExperimentalAPI(requireJson)
停止或开启采集 Avatar 纹理内容
从 Avatar 虚拟形象切换到真人形象时,需要调用 stopCaptureAvatar 停止采集 Avatar 纹理内容;
// 停止采集 Avatar 纹理内容
mCharacterHelper.stopCaptureAvatar();
从真人形象切换到 Avatar 虚拟形象时,需要调用 startCaptureAvatar 开始采集 Avatar 纹理内容,详情请参考 本文档 6.1 获取 Avatar 的纹理内容。
另外,ZEGO 支持在虚拟直播中加入实时消息互动功能,实时展示房间内的消息,例如发消息、进退房提示、互动通知等。更多功能可以加下面二维码联系我们:
本文转载自实时互动网,文章出处《虚拟直播实现流程(多人连麦直播互动为例)》
虚拟直播实现流程(多人连麦直播互动为例)相关推荐
- 直播体验深度优化方案——连麦互动直播
摘要:一.前言移动直播这把火从2015年一直烧到2016年,毫无疑问直播是当前移动互联网最热门的领域之一,在超大热度的引导下直播领域也吸引了大量的商业资本.在这各大直播应用万花齐放的时刻,也正是直播应 ...
- 直播软件自动化测试,基于SRS-Bench工具的直播平台性能测试
摘要:性能测试通过自动化的测试工具模拟正常.异常场景来对系统的各项性能指标进行测试.通过性能测试可以分析一个系统能力.瓶颈.关键问题等.本文结合直播平台的部分场景,使用开源SRS-Bench工具对直播 ...
- 【火山RTC】千人聊天、直播连麦、云渲染
火山引擎 RTC 在互娱场景下的最佳实践 杨若扬 字节跳动技术团队 火山引擎 RTC 在互娱场景下的最佳实践 印象比较深的是智能合流,即客户端做合流,减轻SFU服务器的压力. 云渲染的部署优化? 单人 ...
- 直播多人连麦技术浅谈
前言 随着直播行业的发展,平台玩法越来越多.其中秀场连麦直播玩法人气较高,一方面改变了主播与观众对立的体验,另一方面拉近了主播与观众的距离,对于拉动主播收入平台营收起到了十分重要的作用.在此衍生出来的 ...
- 直播多人连麦技术简介
前言 随着直播行业的发展,平台玩法越来越多.其中秀场连麦直播玩法人气较高,一方面改变了主播与观众对立的体验,另一方面拉近了主播与观众的距离,对于拉动主播收入平台营收起到了十分重要的作用.在此衍生出来的 ...
- 声网连麦+直播+视频+游戏“史上最强”社交直播方案 打造陌陌全新8.0改版
做直播的,每天烧钱买流量,用户留存却是个问题.留不住用户,天天买量,天天流失.怎么破?做社交的,烧钱获客,赢得了口碑,却不知道如何变现,怎么破?做App的,装机量是上去了,用户活跃度和打开率却一直do ...
- 软件导播台多画面切换支持多人连麦实测(实测组图)
阿酷TONY / 原创 / 2023-3-21 / 轻导播台软件实测 导播台文章,我以前介绍过一种在线导播台(网页版/浏览器版导播台),今天再介绍一款客户端版的简易导播台. A>原在线导播台(网 ...
- 网易云信吴桐:直播体验深度优化方案——连麦互动直播
一.前言 移动直播这把火从2015年一直烧到2016年,毫无疑问直播是当前移动互联网最热门的领域之一,在超大热度的引导下直播领域也吸引了大量的商业资本.在这各大直播应用万花齐放的时刻,也正是直播应用面 ...
- Python如何实现24个微信大群万人同步转发直播?
作者 | 猪哥66 来源 | CSDN博客 今天我们来学习微信机器人多群转发做同步图文直播! 一.背景介绍 猪哥一年前在建Python学习群的时候就说过,要邀请企业大佬来学习群做直播. 其实文章早就写 ...
最新文章
- J2EE 中的服务器 tomcat6.0 配置
- 23、MySQL如何处理无效数据值
- 格式化_U盘提示格式化怎么办 U盘提示格式化解决方法【详解】
- (C#)Windows Shell 外壳编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令...
- ax200网卡支持Linux吗,Deepin 20和Win10双系统中AX200网卡不能用的请关闭快速启动
- STM32之内部FLASH例程
- 哔哩哔哩公司swot分析_可口可乐公司2019年SWOT分析
- 【原】使用Bmob作为iOS后台开发心得——查询关联关系(BmobRelation)
- 护肤品APP界面设计模板,可以临摹的UI好素材
- iOS开发——基础篇——iOS开发 Xcode8中遇到的问题及改动
- 测试有道:微软测试技术心得 1
- 搜索引擎登录工具_做seo必须懂的十条搜索引擎语法
- 算法与数据结构1800题
- 在机器学习领域,主要有哪三类不同的学习方法
- Python的特殊属性和用法
- ブリアー / 三星枪
- 今日早报 每日精选12条新闻简报 每天一分钟 知晓天下事 2月17日
- matlab他励直流电机,他励直流电机制动过程的MATLAB分析
- Nginx 502的解决方法
- JS生成 UUID的四种方法