zoukankan      html  css  js  c++  java
  • windows mediasoup-demo 公网部署 解决部署后无法看到对方的视频

    环境

    • Windows10 操作系统
    • node -v
      • v14.17.6(官网要求 >= v8.6.0)
    • npm -v
      • 7.22.0
    • git --version
      • git version 2.29.2.windows.2
    • python -V
      • Python 2.7.18(-V大写,试了 python3 不行,不清楚什么原因。)
    • visual studio v2017 及以上(官网要求 2015 以上),我使用了 VS2017。(Visual Studio 不是 Visual Studio Code)

    ps: mediasoup的流媒体服务是C++编写的,编译需要依赖visual studio。

    其他设置

    1. 将 VS2017 的 MSBuild.exe 加入到 Path 中。类似:C:somepathMicrosoft Visual Studio2019somepathMSBuildCurrentBin,并不绝对相同,需要找一找 MSBuild 目录下面...bin下面会有 MSBuild.exe。
      1. 完整路径例子:C:Program Files (x86)Microsoft Visual Studio2017BuildToolsMSBuild15.0Bin
    2. 新建环境变量 GYP_MSVS_VERSION ,值为 visual studio 的版本。如果使用的是 VS2017 就写 2017。
    3. node-gyp: https://github.com/nodejs/node-gyp#on-windows
    npm install -g node-gyp

     server编译时可能会遇到的错误:

    gyp ERR! find VS msvs_version not set from command line or npm config
    gyp ERR! find VS VCINSTALLDIR not set, not running in VS Command Prompt
    gyp ERR! find VS checking VS2017 (15.9.28307.1622) found at:
    gyp ERR! find VS "C:Program Files (x86)Microsoft Visual Studio2017Community"
    gyp ERR! find VS - "Visual Studio C++ core features" missing
    gyp ERR! find VS could not find a version of Visual Studio 2017 or newer to use
    gyp ERR! find VS looking for Visual Studio 2015
    gyp ERR! find VS - not found
    gyp ERR! find VS not looking for VS2013 as it is only supported up to Node.js 8
    gyp ERR! find VS
    gyp ERR! find VS **************************************************************
    gyp ERR! find VS You need to install the latest version of Visual Studio
    gyp ERR! find VS including the "Desktop development with C++" workload.
    gyp ERR! find VS For more information consult the documentation at:
    gyp ERR! find VS https://github.com/nodejs/node-gyp#on-windows
    gyp ERR! find VS **************************************************************
    gyp ERR! find VS

    按要求安装visual studio(不报上面的错就无所谓,本地多半以前安装过,但是服务器上可能需要安装。):

    Install tools and configuration manually:
    - Install Visual C++ Build Environment: Visual Studio Build Tools (using "Visual C++ build tools" workload) or Visual Studio Community (using the "**Desktop development with C++**" workload)
    - Launch cmd, **npm config set msvs_version 2017**
    Visual Studio Build Tools 版本的vs需要Visual C++ build tools模块,Community 版本的需要**Desktop development with C++**模块,通过 Visual Studio Installer 配置。

    下载项目

    // npm config set registry https://registry.npm.taobao.org
    git clone https://github.com/versatica/mediasoup-demo.git
    //注意:cnpm 如果出错 就用 npm
    或许需要
    cd mediasoup-demo
    git checkout v3

    切换到 v3。目前应该默认就是 v3 版本,如果更新就需要切换。

    github 比较难以访问,可以使用 gitee 中已经同步过的项目,项目地址为: https://gitee.com/xunxinyuan/mediasoup-demo.git
     
    修改包

    进入 server 文件夹,打开 package.json 文件。修改第 22 行,为 ,(app 里面相应的也可以改)

    // "mediasoup": "github:versatica/mediasoup#v3",
    "mediasoup": "^3.6.16"
    如果不修改此行,会从 github 中下载 mediasoup-v3 版本的依赖,可能会超级慢。修改后会直接从 npm 的镜像源中下载。

    服务端下载依赖、编译

    cd server
    npm install
    可能编译挺长时间,会下载、生成使用C++编写的 mediasoup 底层流媒体服务。*/server/node_modules/mediasoup 这个目录,这个项目下的 worker目录下就是 c++ 源码,后续自己有修改后直接make就可以?。
    “E:yttx_meetingserver
    ode_modulesmediasoupworkermediasoup-worker.sln”(默认目标) (1) ->
    “E:yttx_meetingserver
    ode_modulesmediasoupworkerdepsopensslopenssl.vcxproj”(默认目标) (8) ->
    (Lib 目标) ->
      rand_egd.obj : warning LNK4221: 此对象文件未定义任何之前未定义的公共符号,因此任何耗用此库的链接操作都不会使用此文件 [E:yttx_meetingserver
    ode_modulesmediasoupworkerdepsopensslopenssl.vcxproj]
      ecp_nistputil.obj : warning LNK4221: 此对象文件未定义任何之前未定义的公共符号,因此任何耗用此库的链接操作都不会使用此文件 [E:yttx_meetingserver
    ode_modulesmediasoupworkerdepsopensslopenssl.vcxp
    roj]
      ecp_nistp521.obj : warning LNK4221: 此对象文件未定义任何之前未定义的公共符号,因此任何耗用此库的链接操作都不会使用此文件 [E:yttx_meetingserver
    ode_modulesmediasoupworkerdepsopensslopenssl.vcxpr
    oj]
      ecp_nistp256.obj : warning LNK4221: 此对象文件未定义任何之前未定义的公共符号,因此任何耗用此库的链接操作都不会使用此文件 [E:yttx_meetingserver
    ode_modulesmediasoupworkerdepsopensslopenssl.vcxpr
    oj]
      ecp_nistp224.obj : warning LNK4221: 此对象文件未定义任何之前未定义的公共符号,因此任何耗用此库的链接操作都不会使用此文件 [E:yttx_meetingserver
    ode_modulesmediasoupworkerdepsopensslopenssl.vcxpr
    oj]
      ebcdic.obj : warning LNK4221: 此对象文件未定义任何之前未定义的公共符号,因此任何耗用此库的链接操作都不会使用此文件 [E:yttx_meetingserver
    ode_modulesmediasoupworkerdepsopensslopenssl.vcxproj]
    
    
        16 个警告
        0 个错误
    
    
    已用时间 00:07:56.51
    npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@^1.2.7 (node_moduleschokidar
    ode_modulesfsevents):
    npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents@1.2.13: wanted {"os":"darwin","arch":"any"} (current: {"os":"win32","arch":"x64"})
    
    
    added 792 packages from 415 contributors and audited 793 packages in 508.401s
    
    
    26 packages are looking for funding
      run `npm fund` for details
    
    
    found 11 vulnerabilities (7 low, 2 moderate, 2 high)
      run `npm audit fix` to fix them, or `npm audit` for details

    客户端下载依赖、编译

    进入 mediasoup-demo/app 文件夹,(可以修改 .eslintrc.js 文件中 linebreak-style 配置项,原先为 unix(对应linux),修改为 windows)

    依次运行以下命令:
    npm install -g gulp-cli
    npm install
    如果报错:
    npm ERR! code EINVALIDTAGNAME
    npm ERR! Invalid tag name ">=^16.0.0": Tags may not have any characters that encodeURIComponent encodes.

    运行:

    npm install --legacy-peer-deps

    修改配置文件

    客户端和服务端在一个项目里,配置是相互的。客户端(app)也使用的 /server/ 里面的 config.js 配置,客户端编译会把静态文件输出到 ./server/public 目录,本地服务也是监听的 ./server/public 。

     
    复制 server 文件夹下的 config.example.js,修改为 config.js ,按照自己的情况修改。

    签名证书和https信令监听端口

    在 server 文件夹下新增 certs 文件夹,将自己的公钥证书和私钥证书放进去。修改 config.js 的配置。cert 为公有证书,key 为私有证书。
    可以参考这个链接生成证书:https://www.chinassl.net/ssltools/free-ssl.html
    https  : {
            listenIp   : '0.0.0.0',
            // NOTE: Don't change listenPort (client app assumes 4443).
            listenPort : process.env.PROTOO_LISTEN_PORT || 4443,
            // NOTE: Set your own valid certificate files.
            tls        : {
                cert : process.env.HTTPS_CERT_FULLCHAIN || `${__dirname}/certs/www.*****.com.pem`,
                key  : process.env.HTTPS_CERT_PRIVKEY || `${__dirname}/certs/www.*****.com.key`
            }
        },
    这里的 4443 端口,对应app建立wss的端口,文件为app/lib/urlFactory.js
    let protooPort = 4443;
    
    if (window.location.hostname === 'test.mediasoup.org')
        protooPort = 4444;
    
    export function getProtooUrl({ roomId, peerId })
    {
        const hostname = window.location.hostname;
    
        return `wss://${hostname}:${protooPort}/?roomId=${roomId}&peerId=${peerId}`;
    }

    如果要改端口,两个一起改。

    webRtcTransportOptions 和 plainTransportOptions 的 listenIps

    ip配置我用'0.0.0.0'也能使用,有的资料显示配置成本机的内网IP也可以正常运行,看情况,如果有问题都可以试一下。建议先使用 0.0.0.0 试一下。

    announcedIP 使用内网测试没问题,服务器部署就设置为公网IP。

    listenIps : [
                    {
                        ip          : process.env.MEDIASOUP_LISTEN_IP || '0.0.0.0',
                        announcedIp : 'XXX.XXX.XXX.XXX'
                    }
                ],

    运行

    进入 server 文件夹,运行命令行设置临时环境变量
    set DEBUG=${DEBUG:="*mediasoup* *INFO* *WARN* *ERROR*"} INTERACTIVE=${INTERACTIVE:="true"}
    运行服务端:
    node server.js

     也可以不设置环境变量,直接运行 node server.js ,主要是设置  INTERACTIVE ,server.js 有一项通过这个参数开启:

    run();
    
    async function run()
    {
        // Open the interactive server.
        await interactiveServer();
    
        // Open the interactive client.
        if (process.env.INTERACTIVE === 'true' || process.env.INTERACTIVE === '1')
            await interactiveClient();
    
        // Run a mediasoup Worker.
        await runMediasoupWorkers();
    
        // Create Express app.
        await createExpressApp();
    
        // Run HTTPS server.
        await runHttpsServer();
    
        // Run a protoo WebSocketServer.
        await runProtooWebSocketServer();
    
        // Log rooms status every X seconds.
        setInterval(() =>
        {
            for (const room of rooms.values())
            {
                room.logStatus();
            }
        }, 120000);
    }

     运行客户端

     进入 app 文件夹,运行命令行窗口

    gulp live

    可以在 app/gulpfile.js 中看到配置:

    gulp.task('live', gulp.series(
        'browser:base',
        (done) =>
        {
            const config = require('../server/config');
    
            browserSync(
                {
                    open      : 'external',
                    host      : config.domain,
                    startPath : '/?info=true',
                    server    :
                    {
                        baseDir : OUTPUT_DIR
                    },
                    https     : config.https.tls,
                    ghostMode : false,
                    files     : path.join(OUTPUT_DIR, '**', '*')
                });
    
            done();
        }
    ));

    这个命令会打包输出到 server/public ,并以此提供静态文件服务。

    会自动打开浏览器,或者浏览器中输入 https://locahost:3000/ 也可以。可以在 browserSync 参数对象中添加 port 参数指定端口,默认不添加,指定的 3000。

     如果是要部署到服务器,单独运行打包命令:

    gulp dist

    部署(服务器也需要上面的环境)

    将整个 server 文件夹上传到服务器,并使用 Web 服务器(Apache、Nginx 、IIS、node koa 等)公开该 server/public 文件夹,也可以复制走,放到其他位置。

    再根据服务器配置 server/config.js 。

    运行!

    如果希望将它作为守护进程/服务运行,可以使用 pm2 进程管理器。或者可以在其他选项中将其 dockerize。

    部署后无法看到对方的视频

    首先,前面设置过的 ip 可以尝试更换一下,可能和内网、公网IP可能不一致有关。

    然后有一个最重要的地方(config.js):

    workerSettings : {
                logLevel   : 'warn',
                logTags    : [ 'info', 'ice', 'dtls', 'rtp', 'srtp', 'rtcp', 'rtx', 'bwe', 'score', 'simulcast', 'svc', 'sctp' ],
                rtcMinPort : process.env.MEDIASOUP_MIN_PORT || 40000,
                rtcMaxPort : process.env.MEDIASOUP_MAX_PORT || 49999
            },

    服务器需要单独设置开放  rtcMinPort 和 rtcMaxPort 这个范围端口的公网 UDP 访问权限。

  • 相关阅读:
    php (一)
    php 运算符
    Python 元组
    Python 深拷贝和浅拷贝的区别
    Python 列表
    Python 字符串
    Python 循环控制
    Python 随机数,数学
    bzoj5018 [Snoi2017]英雄联盟
    bzoj5015 [Snoi2017]礼物
  • 原文地址:https://www.cnblogs.com/jiayouba/p/15232423.html
Copyright © 2011-2022 走看看