用 ZEGO Avatar 做一個虛擬人|虛擬主播直播解決方案
虛擬直播既可以實現單人影片直播,也可以邀請觀眾上麥、與虛擬主播進行多人連麥互動。
虛擬直播場景架構設計
虛擬直播場景的主要架構如下圖所示(以多人連麥直播互動為例):
image。png
虛擬人直播體驗 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 紋理內容、停止表情隨動,主播和房間內的其他觀眾停止拉取該觀眾的流。
虛擬人直播詳細流程圖如下:
image。png
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個月免費試用。
上一篇:如何寫一篇[宮鬥小甜文]?
下一篇:無需烤箱肉鬆銅鑼燒軟香可口超好吃