本文介绍,主播如何通过小游戏平台(ZEGO MiniGameEngine SDK)和实时音视频(ZEGO Express SDK)在 iOS 端开播弹幕游戏。
在实现主播直播弹幕游戏之前,请确保:
ZEGO 提供了 示例源码,以供开发者进一步了解如何实现弹幕游戏。
主播直播弹幕游戏的流程如下图所示:
实现流程中会使用到 ZEGO MiniGameEngine SDK 的两个主类,即 ZegoMiniGameEngine 和 ZegoCloudGameEngine。
ZegoMiniGameEngine:用于实现初始化、以及获取游戏列表和游戏详情。
ZegoCloudGameEngine:用于设置弹幕游戏的容器、开始/停止弹幕游戏。
请参考 服务端 API - 调用方式 了解如何接入 ZEGO 小游戏产品的服务端,并在您的服务端上实现 获取游戏启动码,以便后续 主播启动弹幕游戏 前获取游戏启动码。
ZEGO 为您提供了服务端示例源码,可供参考。但为了您的数据安全,请勿将其直接用于线上生产环境。
当您的用户在使用 ZEGO 小游戏服务时,ZEGO 服务端会根据用户初始化 SDK 时携带的 Token 参数判断用户是否有权限,避免因权限控制缺失或操作不当引发的风险问题。
请参考 使用 Token 鉴权 文档,在您的服务端生成 Token 并返回给向用户客户端。
为便捷项目测试,您可以从 ZEGO 控制台 获取临时 Token,详情请参考控制台的 项目信息 - 辅助工具。但项目上线时,请从您的服务端生成 Token,以保障安全。
请参考实时音视频的 实现视频通话 - 创建引擎,创建 ZegoExpressEngine。
完成初始化之后,请参考 实时音视频的 实现视频通话 - 登录房间,登录 RTC 房间。
引入头文件,示例代码如下:
import <ZegoMiniGameEngine/ZegoMiniGameEngine.h>
调用 ZegoMiniGameEngine > sharedEngine 接口创建 ZegoMiniGameEngine 单例对象。调用 init 接口,传入申请到的 AppID、您服务端生成的 Token、自定义的用户 ID 和用户名称、以及头像图片 URL 参数,初始化 ZEGO MiniGameEngine SDK。
调用 ZegoCloudGameEngine > sharedEngine 接口获取 ZegoCloudGameEngine 实例。
示例代码如下:
// 初始化 ZEGO MiniGameEngine SDK
ZegoGameUserInfo *userInfo = [[ZegoGameUserInfo alloc] init];
// appID 在 [ZEGO 控制台](https://console.zego.im/) 创建项目后获得,格式为:appID + L,如:1234567890L
long appID = 您的 AppID;
NSString *token = @"your token"; // 从您的服务器获取到的 Token
userInfo.userID = @"your user ID"; // 自定义的用户 ID,必选,需要与生成 Token 的 userID 保持一致
// 仅支持数字,英文字符和 '~', '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '_', '+', '=', '-', '`', ';', '’', ',', '.', '<', '>', '/', '\'。
// 请保证 userId 在相同的 appID 下全局唯一。
userInfo.userName = @"your user name"; // 自定义的用户名称,必选
userInfo.avatar = @"your user avatar"; // 用户头像 URL,传输协议需为 HTTPS,可选
[ZegoMiniGameEngine.sharedEngine init:appID token:token userInfo:userInfo callBack:^(int errorCode, id _Nullable object) {
}];
// 获取 ZegoCloudGameEngine 实例
ZegoCloudGameEngine *cloudGameEngine = [ZegoCloudGameEngine sharedEngine];
调用 setCloudGameContainer 设置游戏父容器,以便后续启动游戏。调用 setCloudGameEngineHandler 接口注册监听小游戏事件,相关事件在 启动弹幕游戏 后通过 ZegoCloudGameEngineHandler 回调返回。
示例代码如下:
UIView *gameContainer = xxx; // 需要在 UI 层设置一个常见的 View,作为展示游戏的区域
// 设置游戏容器
[ZegoCloudGameEngine.sharedEngine setCloudGameContainer:gameContainer];
// 设置游戏事件代理
[ZegoCloudGameEngine.sharedEngine setCloudGameEngineHandler:self];
// 实现游戏事件
#pragma mark----ZegoCloudGameEngineHandler
- (void)onCloudGameError:(int)errorCode message:(NSString *)message {
// 弹幕游戏返回错误
}
- (void)onCloudGameFirstFrame {
// 弹幕游戏首帧渲染成功
// 在启动弹幕游戏到游戏成功加载的过程中,您可以播放自定义加载动画或实现其他业务逻辑
// 在收到本回调后,即可停止播放或其他业务逻辑
}
调用 getGameList 接口,传入 ZegoGameModeCloudGame
,指定游戏模式为弹幕游戏模式,获取弹幕游戏列表,在列表中选择想玩的弹幕游戏 ID。
如下代码展示如何获取弹幕游戏模式的游戏列表:
// 获取弹幕游戏列表
// 指定第 1 个参数(gameMode)为 ZegoGameModeCloudGame,表示列表中的游戏的模式为弹幕游戏
[ZegoMiniGameEngine.sharedEngine getGameList:ZegoGameModeCloudGame callBack:^(NSInteger errorCode, NSArray<ZegoGameInfo *> *gameList) {
// gameList 为弹幕游戏列表
}];
确定需要玩的游戏后,主播还需要获取相应的游戏启动码。以上场景的核心能力,您已在 接入 ZEGO 服务端 实现了。此时,您需要自行实现如何在客户端向您的后台发起请求。
调用 startCloudGame 接口,传入游戏房间 ID 和游戏 ID,启动游戏。
(建议)如果在此步骤传入了游戏启动码,则在加载完成后,游戏会自动开始。
如果没有传入,则需要在加载完成后,在游戏内手动输入启动码。
示例代码如下:
NSString *roomID = @"your room id"; // 游戏房间 ID,建议与您的业务房间 ID 保持一致
NSString *gameID = @"your game id"; // 游戏 ID
// 设置游戏的配置,选填
NSDictionary *gameConfig = @{
// 此处可以传入游戏启动码和其他参数,参数格式视游戏而不同,请联系 ZEGO 技术支持。
// (建议)如果此处输入游戏启动码,则在 startCloudGame 接口调用完成后,游戏自动开始。
// 如果为空,则在 startCloudGame 接口调用完后,游戏内会要求用户输入游戏启动码。
@"runningParameters" : @“游戏启动码”,
};
// 加载游戏
[ZegoCloudGameEngine.sharedEngine startCloudGame:gameID roomID:roomID gameConfig:gameConfig callBack:^(int errorCode, id _Nullable object) {
// 运行结果回调
}];
游戏启动后,调用 startPublishCloudGameStream 接口,将弹幕游戏视频流转推到 RTC 房间时。
NSString *roomID = @"your room id"; // 游戏房间 ID,建议与您的业务房间 ID 保持一致
NSString *gameID = @"your game id"; // 游戏 ID
NSString *streamID = @"your stream id"; // 流 ID,长度不超过 256 的字符串,由您自定义
// 仅支持数字,英文字符 和 '-', '_'。
// 在同一个 AppID 下,开发者需要保证“streamID” 全局唯一,如果不同用户各推了一条 “streamID” 相同,后推流的用户会推流失败。
[ZegoCloudGameEngine.sharedEngine startPublishCloudGameStream:gameID roomID:roomID streamID:streamID callBack:^(int errorCode, id _Nullable object) {
// 推流结果回调
}];
主播需要先停止转推,再停止弹幕游戏。
当需要停止转推游戏视频流时,请调用 stopPublishCloudGameStream 接口。
NSString *roomID = @"your room id"; // 游戏房间 ID,建议与您的业务房间 ID 保持一致
NSString *gameID = @"your game id"; // 游戏 ID
NSString *streamID = @"your stream id"; // 流ID
[ZegoCloudGameEngine.sharedEngine stopPublishCloudGameStream:gameID roomID:roomID streamID:streamID callBack:^(int errorCode, id _Nullable object) {
// 停止推流结果回调
}];
当需要停止游戏时,调用 stopCloudGame 接口停止弹幕游戏。
示例代码如下:
NSString *roomID = @"your room id"; // 游戏房间 ID,建议与您的业务房间 ID 保持一致
NSString *gameID = @"your game id"; // 游戏 ID
[ZegoCloudGameEngine.sharedEngine stopCloudGame:gameID roomID:roomID callBack:^(int errorCode, id _Nullable object) {
// 停止弹幕游戏结果回调
}];
如果不再需要开播弹幕游戏,可以通过退出 RTC 房间、销毁 ZegoExpressEngine 以及反初始化 ZEGO MiniGameEngine SDK,以释放资源。
请参考实时音视频的 实现视频通话 - 退出房间,完成退出 RTC 房间。
请参考实时音视频的 实现视频通话 - 销毁引擎,完成销毁。
调用 unInit 接口反初始化 ZEGO MiniGameEngine SDK。
示例代码如下:
[ZegoMiniGameEngine.sharedEngine unInit];
如果您接入的游戏已提供移动端键盘,且您满足该键盘的效果,无需重新自定义键盘,则可以跳过本步骤。
主播在移动端开播弹幕游戏后,如果游戏内没有提供键盘,需要调用 sendKeyboardEvent 接口,传入 key(键盘的 code 码),实现键盘事件,如前进、调整视角等,以便正常玩游戏。如需了解键盘 code 码,请参考 JavaScript Key Code Event Tool。
示例代码如下:
int keyboardCode = 65; // 对应为键盘上的 “A”
[ZegoCloudGameEngine.sharedEngine sendKeyboardEvent:keyboardCode];
联系我们
文档反馈