外部EXE能力
本章节介绍如何使用外部EXE能力。
前置说明
- windows 7及以上系统
- 虎牙主播端PC版本>=5.12.24.0
技术框架
其中:
- 虎牙小程序通过js sdk接口,提供以下功能:
- 下载EXE
- 初始化环境
- 启动EXE
- 发送消息给EXE
- 接受EXE消息
- 关闭EXE
- 虎牙主播端:
- 实现虎牙小程序的js sdk接口
- 实现EXE的cpp sdk接口
- 提供小程序到EXE的消息通道
- EXE通过cpp sdk接口:
- 接受小程序发送过来的消息
- 把EXE的画面投放到视频流中
- 发送消息给小程序
时序图如下:
小程序开发
准备工作
直接使用这个小程序Demo项目,其中支持的小程序类型为:
- PC主播端-面板
参考创建小程序,创建一个小程序和创建一个开发版本。
配置
参考demo里面的src/config.js,里面的内容是一些配置:
var config = {
// 必须要填写,并且是业务唯一的,业务后台会根据这个来获取game的下载配置信息
"game_name": "游戏Demo",
// zip包的地址
"game_url": "https://g1c972e2182629c7-59ku7pqm.hyext.com/extResource/GameDemo.zip",
// zip包的md5
"game_md5": "f5fc57a45bdb293d2e298de50022bc2e",
// zip包解压之后的文件名
"game_exe_name": "GameDemo.exe"
}
export default config
下载EXE
首先需要把目标EXE下载下来:
- 调用
hyExt.fs.downloadBatchExe()下载EXE:
hyExt.fs.downloadBatchRes([{
url: config.game_url,
md5: config.game_md5,
unzip: true,
offline: false,
}])
- 下载接口resolve之后,调用
hyExt.context.on('downloadProgress')监听下载进度消息:
hyExt.context.on('downloadProgress', ({ res, md5, bytesLoaded, bytesTotal }) => {
if (md5 === config.game_md5) {
if (res === 0) {
// 下载完成
} else if (res === 1) {
// 下载中,进度可以通过bytesLoaded和bytesTotal字段进行计算
} else {
// 下载失败
}
}
})
当监听到res为0时,表示下载完成,可以进行下一步操作。
监听EXE消息
- 调用
hyExt.exe.onGameMessage()监听消息:
// 由于监听接口是全局的,最好用一个消息总线分发消息
const bus = new EventEmitter()
hyExt.exe.onGameMessage({
callback: notice => {
// 触发消息
bus.emit('gameMessage', notice)
}
})
后续初始化EXE环境的状态以及跟EXE通信的消息都是通过这个接口的回调函数接收的。
初始化EXE环境
- 调用
hyExt.exe.initGameEnv()初始化EXE环境:
hyExt.exe.initGameEnv()
- 监听初始化EXE环境相关的消息:
bus.addListener('gameMessage', notice => {
const { name, message } = notice
if (name === 'GameEnvEvent') {
const { res, progress } = JSON.parse(message)
if (Number(res) === 1) {
// 准备中
} else if (Number(res) === 0) {
// 准备完毕
} else if (Number(res) === 2) {
// 相关功能已被其他小程序占用
} else if (Number(res) === 3) {
// 解压失败
} else {
// 其它异常
}
}
})
当监听到res为0时,表示初始化环境完成,可以进行下一步操作。
启动EXE
游戏环境初始化完成后,可以启动EXE:
hyExt.exe.launchGame({
processMode: 'local',
md5: config.game_md5,
exeName: config.game_exe_name,
})
接口resolve之后,可以看到demo EXE启动起来了:
demo还会把EXE部份内容投放到视频流中:
更多的内容可以参考EXE demo。
通信
EXE成功启动起来后,可以调用接口给EXE发送消息:
hyExt.exe.sendToGame({
message: 'hello world'
})
接口resolve之后,可以看到demo EXE收到消息并外显出来:
同时通过上面的消息总线代理的hyExt.exe.onGameMessage(),可以接收到EXE发送过来的消息:
bus.addListener('gameMessage', notice => {
// EXE发送过来的消息
})
在demo EXE上输入内容并点击“发送消息到小程序”:
关闭
调用hyExt.exe.shutdownGame()关闭EXE:
hyExt.exe.shutdownGame()
接口resolve之后,EXE会被关闭。
注意:当小程序被关闭,或者主播端关播/关闭时,EXE也会被关闭。
EXE开发
参考https://github.com/weigod/game_sdk_demo。