1.0.15 • Published 2 days ago

@hysc/boom-cpp-plugin v1.0.15

Weekly downloads
-
License
ISC
Repository
-
Last release
2 days ago

文件说明

cppAudioPlugin-mac // mac 插件

cppAudioPlugin-win32 // windows 插件

cppplugin // js bridge层

依赖说明

该项目依赖于外部库的 electronelectron-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
1.0.15

2 days ago

1.0.14

5 months ago

1.0.12

7 months ago

1.0.11

8 months ago

1.0.10

8 months ago

1.0.9

8 months ago

1.0.8

8 months ago

1.0.7

8 months ago

1.0.6

9 months ago

1.0.5

9 months ago

1.0.4

9 months ago

1.0.3

9 months ago

1.0.2

9 months ago

1.0.1

9 months ago

1.0.0

9 months ago