@hysc/boom-cpp-plugin
v1.0.15
Published
cppAudioPlugin-mac // mac 插件
Downloads
18
Keywords
Readme
文件说明
cppAudioPlugin-mac // mac 插件
cppAudioPlugin-win32 // windows 插件
cppplugin // js bridge层
依赖说明
该项目依赖于外部库的 electron
和 electron-log
。请在使用前安装对应的依赖。
该项目使用了.node文件,所以需要在electron主进程中使用对应的node-loader去处理该文件。请对照使用的webpack或者vite版本去安装对应的包。 webpack参考配置如下:
...
module: {
rules: [{
test: /\.node$/,
loader: 'node-loader',
options: {
name: '[name].[ext]'
}
}]
}
...
功能
该插件目前存在三个功能 高度和boom 的web-sdk 耦合
- 一个是将指定的窗口弹出到最上层,传入一个窗口id
- 一个是采集系统的声音
- 一个是检测窗口的变化,主要是用来处理ppt播放之后导致webrtc本身拿不到变化之后的视频流的问题
使用
打包文件
在打包的时候,需要将对应的插件文件打包到对应的目录下面,比如mac的插件文件,需要打包到mac的目录下面,windows的插件文件,需要打包到windows的目录下面。
packages.json 中的配置
...
"mac": {
"extraFiles": [
{
"from": "node_modules/@hysc/boom-cpp-plugin/cppAudioPlugin-mac",
"to": "Frameworks/node_modules/@hysc/boom-cpp-plugin/cppAudioPlugin-mac"
},
],
...
},
...
// 目标产物是32位 cppAudioPlugin-win32
// 目标产物是64位 cppAudioPlugin-win64
"win": {
"extraFiles": [
"node_modules/@hysc/boom-cpp-plugin/cppAudioPlugin-win32"
],
...
}
在electron主进程中使用
import CppPluginBridge from '@hysc/boom-cpp-plugin'
/**
*
如果是集成了boom sdk, 在render-msg 事件里面去做处理
会有两个单独的code 去做这个处理
一个是 10110 代表采集系统或者对应窗口的声音,目前只对windows生效
一个是10113 代表去处理窗口变化检测
*/
/**
* cpp插件不允许在没有销毁的情况下在同一个进程中初始化两次
* 所以,如果视频会议应用销毁之后,一定要销毁当前的cpp插件
* 目前在会议内只有在共享屏幕的时候,用到了该插件,所以在共享屏幕结束之后,需要销毁该插件
* render-msg 事件中,需要处理两个code, 销毁的情况
* 10110
* 10113
* 还有一个是需要在render-share-msg 关闭屏幕分享相关窗口的时候,需要销毁
*
*/
// 在需要的地方初始化
// main.js 中定义一个全局的变量去存储该插件的实例
let mCppPlugin
// 屏幕分享相关消息
...
ipcMain.on('render-share-msg', (e, args) => {
logger.log('render-share-msg, type:', args.code)
if (args.code === 0) {
// 关闭屏幕分享相关的窗口
if (mainWindow) {
...
if (mCppPlugin) {
mCppPlugin.destroy()
mCppPlugin = null
}
...
}
}
})
...
// 在 render-msg 事件中去做处理
...
// 采集对应窗口的音频流数据
else if (data.code === 10110) {
// mainWindow 是视频会议窗口创建出来的实例
if (mainWindow) {
if (isWindows()) {
const isStart = data.isStart
logger.log('get audio from cpp plugin', isStart)
if (isStart) {
if (!mCppPlugin) {
mCppPlugin = new CppPluginBridge()
//绑定视频会议窗口,用来 通过 webContents 传递信息给sdk,进行通信
mCppPlugin.bindTargetWindow(mainWindow)
}
// 初始化插件,引用对应的cpp插件进行初始化,如果初始化失败,则代表cpp插件不可用
// 如果是windows init 参数传入 'x64' 表示使用的是64位的插件版本, 默认是32位的
mCppPlugin.init()
// 设置音频采集回调,在这里面去接收采集到的音频数据,然后发给sdk
mCppPlugin.setAudioPluginEventCallback()
/**
* 开启声音采集
*
* sourceId 指定窗口ID,设置为0表示采集当前运行进程本身
第二个参数表示采集模式,true表示只采集指定窗口进程 false表示采集除了本地窗口进程 的声音
*/
mCppPlugin.startAudioCapture(0, false)
} else {
// 取消采集,销毁插件
if (mCppPlugin) {
mCppPlugin.destroy()
mCppPlugin = null
}
}
}
}
}
// 窗口是否全屏的检测
else if (data.code === 10113) {
let { sourceId, isStart, sourceName } = data
if (isStart) {
// 共享整个屏幕不需要处理
const isFullScreen = sourceId.startsWith('screen')
if (isFullScreen) {
return
}
sourceId = sourceId.split(':')[1]
logger.log('开始窗口是否全屏检测', sourceId, isStart, isWindows())
if (sourceId) {
logger.log('start detect window size change')
if (!mCppPlugin) {
mCppPlugin = new CppPluginBridge()
mCppPlugin.bindTargetWindow(mainWindow)
}
mCppPlugin.init()
mCppPlugin.setWinPluginEventCallBack()
mCppPlugin.startWindowDetector(sourceId, sourceName)
mCppPlugin.bringWindowToTop(sourceId)
}
} else {
logger.log('stop detect window size change')
if (mCppPlugin) {
mCppPlugin.destroy()
mCppPlugin = null
}
}
}
...
将arm架构和 x64架构 合成 一个文件
lipo -create cppAudioPlugin-mac/bjy_electron_plugin-x86.node cppAudioPlugin-mac/bjy_electron_plugin-arm.node -output cppAudioPlugin-mac/bjy_electron_plugin.node