您當前的位置:首頁 > 動漫

用 ZEGO Avatar 做一個虛擬人|虛擬主播直播解決方案

作者:由 ZEGO即構開發者 發表于 動漫時間:2022-10-20

虛擬直播既可以實現單人影片直播,也可以邀請觀眾上麥、與虛擬主播進行多人連麥互動。

虛擬直播場景架構設計

虛擬直播場景的主要架構如下圖所示(以多人連麥直播互動為例):

用 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 紋理內容、停止表情隨動,主播和房間內的其他觀眾停止拉取該觀眾的流。

虛擬人直播詳細流程圖如下:

用 ZEGO 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個月免費試用。

標簽: 虛擬  連麥  avatar  觀眾  直播