节点插件不适用于电子,但适用于 nodejs

Node addon don't work in electron, but worked in nodejs

我写了一个 nodejs 插件,用 node-gyp 编译。 它不适用于电子,但 nodejs 有效。 nodejs和electron节点版本相同

插件做这些事情:

  1. 加载ffmpeg静态库并打开rtsp或本地文件。
  2. 将frame转成rgba颜色到arraybuffer并调用electron的主进程。
  3. 渲染器进程处理数据事件并将数据渲染到 canvas 元素。

在electron中,后面的代码总是return Protol not found

    int status = avformat_open_input(&pFormatContext, url, NULL, NULL);
    if (0 != status) {
        av_log(NULL, AV_LOG_ERROR, "ffmpeg open error: %s\n", av_err2str(status));
        return status;
    }

node-gyp 配置:

{
    "targets": [{
        "target_name": "ffmpeg",
        "sources": ["src/ffmpeg/api/addon.c", "src/ffmpeg/api/ffmpeg.c"],
        "include_dirs": [
            "/home/my/ffmpeg_build/include"
        ],
        "libraries": [
            "-L$$PWD/../lib/ffmpeg-kylinux-aarch64",
            "-lavformat",
            "-lavcodec",
            "-lavutil",
            "-lswscale",
            "-lswresample",
            "-lx264",
            "-lx265"
        ]
    }]
}

Electron 已经包含 ffmpeg(不像 stock Node.js)让你别无选择,只能使用包含的版本 link - 否则你会遇到符号冲突和奇怪的行为 - 这就是你的情况 -因为一些符号将解析为您的版本,其他符号将解析为 built-in 版本。

也许有一个可能的解决方法是将 ffmpeg 静态构建到您的插件中。