使用electron native sdk ,双实例分享屏幕区域,并开启旁路推流,cdn推流返回状态state:2,code:0,但是拉流没看见画面

startShareScreen(){
            let displays = this.rtcEngine.getScreenDisplaysInfo()
            if(displays.length === 0) {
                this.$message.error('未检测到屏幕')
                return
            }
            let areaConfig = this.capture.selectRect
            this.rtcEngine.on(this.rtcEngine.EventType.videoSourceLeaveChannel, msg =>console.log(msg))
            log.tag('分享区域: ',areaConfig)
            this.rtcEngine.videoSourceInitialize(global.APPID)
            this.rtcEngine.videoSourceSetChannelProfile(this.rtcEngine.CHANNEL_PROFILE.LIVE);
            this.videosourceCDNStreamId = `/videosource_live/${this.Room.vsUid}`
            this.rtcEngine.videoSourceJoin(this.Room.token, this.Room.channel, "", this.Room.vsUid)
            this.rtcEngine.on(this.rtcEngine.EventType.videoSourceJoinedSuccess, () => {
                log.tag('videoSourceJoinedSuccess');
                this.rtcEngine.videoSourceSetVideoProfile(this.rtcEngine.VIDEO_PROFILE_TYPE.VIDEO_PROFILE_LANDSCAPE_720P_6, false);
                this.rtcEngine.videoSourceStartScreenCaptureByScreen(displays[0].displayId, {
                    x: areaConfig.x, y: areaConfig.y, width: areaConfig.w, height: areaConfig.h
                }, {
                    width: areaConfig.w, height: areaConfig.h, frameRate: 15, bitrate: 0
                })
                this.$bus.$emit(CUSTOM_EVENT_TYPE.RTMP_PUSH, true, this.videosourceCDNStreamId)
            })
            this.rtcEngine.setClientRole(this.rtcEngine.ROLE.ANCHOR)
        }

目前 electron sdk 应该是只支持用第一个实例来进行旁路推流,你是在第一个实例中实现屏幕共享和旁路推流的吗?

全局只实例了一个rtcEngine,摄像头跟屏幕分享是需要同时推两条cdn推流吗

如果只有一个实例的话,那你是怎么同时实现屏幕共享和摄像头推流的呢?

不需要的,推一路就可以了,但是需要通过 setLiveTranscoding 方法设置直播转码配置,分别为屏幕共享端和摄像头端设置布局:
https://docs.agora.io/cn/Interactive%20Broadcast/API%20Reference/electron/interfaces/transcodingconfig.html

我照文档通过一个实例setVideoDevice推摄像头,调用addPublishStreamUrl推一条cdn上去,然后用videosource再推屏幕流,再调用addPublishStreamUrl再推屏幕流。
照你这么说意思是需要2个实例分别推摄像头跟屏幕流是吧?

是需要两个实例,要用 videoSourceInitialize 方法初始化 videoSource 对象。
不要调两次 addPublishStreamUrl 的。

好的谢谢,我修改下试试

好的,不客气

第二个实例joinChannel传进的uid,需要跟摄像头同个uid吗? videoSourceJoin传进去的uid呢,三个都要一致吗

不能传同一个。在相同频道内需要保证 uid 的唯一性,不能使用相同的 uid 的。

现在我第二个实例调用engine.joinChannel、videoSourceJoin跟第一个实例engine.joinChannel用的同一个uid,推同一条cdn流链接,可以推成功,但是改成跟第一个实例不同uid却反而看到的是黑屏

joinChannelvideoSourceJoin 用的 uid 是一样的?

这不应该啊,你具体是怎么调的?

两个agoraEngine实例,都joinChannel同一个channel,同一个uid,屏幕流这个videosource调用videoSourceJoin也用了同个channel跟uid,推cdn用同一条。

还有同时开摄像头跟屏幕,摄像头就会报这个错,然后摄像头的预览没了。F:\project\node_modules\agora-electron-sdk\js\Api\index.js:492 Can’t find renderer for uid : 0

不需要两个 agoraEngine 实例啊。可能是前面我没和你说明白,如果需要同时进行屏幕共享和摄像头推流,那你只需要 AgoraRtcEngine 和 videoSource 实例就够了。
假设 AgoraRtcEngine 实例用于实现摄像头推流,joinChannel 时设置的 uid 是 1;那么videoSource 对象用于实现屏幕共享, videoSourceJoin 的 uid 设置为 2(或其他不等于 1 的数字)。

原来如此,那如果我分开同时推这两条流并且不转码到cdn,是需要两个agoraEngine吗

不行的,目前 AgoraRtcEngine 只支持单实例,另一个实例必须是 videoSource

这样的话,我得新建个进程再实例个AgoraRtcEngine去推另一个流。那是不是推本地的视频或者文档也是得再实例AgoraRtcEngine再去推一路。那我这几个实例AgoraRtcEngine.joinChannel时uid是可以同一个吗

对,如果 electron 提供的 videoSource 对象的方法无法满足你的需求,那么就得自己新建进程新建实例了。

不可以的

能不能这么操作,
摄像头推cdn设置转码,userCount=1而且transcodingUsers中只配置摄像头这一路的uid,然后屏幕的也设置转码transcodingUsers只配置videosource的uid,分别推的cdn地址不一样,这样能实现对应两条的cdn推不同的流吗