虎牙开放平台文档

外部EXE能力

本章节介绍如何使用外部EXE能力。

前置说明

  • windows 7及以上系统
  • 虎牙主播端PC版本>=5.12.24.0

技术框架

2023 08 17 18 05 11

其中:

  • 虎牙小程序通过js sdk接口,提供以下功能:
    • 下载EXE
    • 初始化环境
    • 启动EXE
    • 发送消息给EXE
    • 接受EXE消息
    • 关闭EXE
  • 虎牙主播端:
    • 实现虎牙小程序的js sdk接口
    • 实现EXE的cpp sdk接口
    • 提供小程序到EXE的消息通道
  • EXE通过cpp sdk接口:
    • 接受小程序发送过来的消息
    • 把EXE的画面投放到视频流中
    • 发送消息给小程序

时序图如下:

2023 08 08 15 57 55

小程序开发

准备工作

直接使用这个小程序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 { // 下载失败 } } })

当监听到res0时,表示下载完成,可以进行下一步操作。

监听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 { // 其它异常 } } })

当监听到res0时,表示初始化环境完成,可以进行下一步操作。

启动EXE

游戏环境初始化完成后,可以启动EXE:

hyExt.exe.launchGame({ processMode: 'local', md5: config.game_md5, exeName: config.game_exe_name, })

接口resolve之后,可以看到demo EXE启动起来了:

2023 08 17 16 33 41

demo还会把EXE部份内容投放到视频流中:

2023 08 17 18 00 15

更多的内容可以参考EXE demo

通信

EXE成功启动起来后,可以调用接口给EXE发送消息:

hyExt.exe.sendToGame({ message: 'hello world' })

接口resolve之后,可以看到demo EXE收到消息并外显出来:

2023 08 17 17 46 02

同时通过上面的消息总线代理的hyExt.exe.onGameMessage(),可以接收到EXE发送过来的消息:

bus.addListener('gameMessage', notice => { // EXE发送过来的消息 })

在demo EXE上输入内容并点击“发送消息到小程序”:

2023 08 17 17 46 38

关闭

调用hyExt.exe.shutdownGame()关闭EXE:

hyExt.exe.shutdownGame()

接口resolve之后,EXE会被关闭。

注意:当小程序被关闭,或者主播端关播/关闭时,EXE也会被关闭。

EXE开发

参考https://github.com/weigod/game_sdk_demo

相关链接