如何在OpenTok屏幕共享订户中检测publishVideo(false)

时间:2018-12-17 19:33:32

标签: angular opentok tokbox

我正在订阅屏幕共享流,如下所示:

this.openTokSession.on('streamCreated', (event: any) => {
    if(event.stream.videoType === 'screen') {
        //it's screen sharing
        var screenSubscriber = this.openTokSession.subscribe(event.stream, 
            'screenshareDisplay', {
                appendMode: 'append',
                width: '100%',
                height: '100%'
                },
            (error: any) => {
                if (error) {
                    console.log(error);
                } else {
                    screenSubscriber.on("videoDisabled", (event: any) => {
                        console.log('videoDisabled1')
                    });  
                }
            }
        );
    } else {
        //it's normal video
    }
});

您会看到我正在尝试在上面的订户上收听videoDisabled,但也在以下会话中尝试过:

this.openTokSession.on("videoDisabled", (event: any) => {
    console.log('videoDisabled1')
    if(typeof(event.stream) !== 'undefined') {
        if(event.stream.videoType === 'screen') {
            console.log('videoDisabled2');
            }
        }
    }); 

...但是,尽管发布者致电publishVideo(false)时我可以看到屏幕共享停止,但这两个事件均未触发。

任何人都可以给我任何指向我应该监听的事件的指针,以及它是在流中还是在会话中?

编辑以回应@Manik的帖子

如果videoType是摄像机,则看起来publishVideo(false)确实会导致videoDisabled事件在订阅服务器上可用,但如果videoType是screen,则不会:

在同一应用程序(同一会话)中,我还有:

var subscriberProperties = {
    insertMode: 'append', 
    width: '100%',
    height: '100%'
};    
var subscriber = this.openTokSession.subscribe(event.stream,
    subscriberDivId,
    subscriberProperties,
    (error: any) => {
        if (error) {
            console.log(error);
        } else {
            subscriber.on('videoDisabled', (event: any) => {
                console.log('videoDisabled');
            });
        }
    }
});

...并且当我在摄像机的发布者上发布Video(false)时,的确确实在该流的订阅者中导致了videoDisabled事件。

我当前的想法是屏幕共享流事件触发中存在错误,或者publishVideo(false)不适用于屏幕共享流。

接下来要尝试的是:Tokbox screenshare issue,即在会话上取消发布以查看是否会产生我可以处理的事件。

编辑2:对于其他为此苦苦挣扎的人来说,并没有解决原始问题-我的TokBox编码错误或行为异常-但确实使订户响应如下所述停止和启动屏幕共享:

和以前一样:

this.openTokSession.on('streamCreated', (event: any) => {
    if(event.stream.videoType === 'screen') {
        //it's screen sharing, pop it into the lh panel
        var screenSubscriberProperties = {
            insertMode: 'append', 
            width: '100%',
            height: '100%'
        };
        var screenSubscriber = this.openTokSession.subscribe(event.stream, 
            'screenshareDisplay', 
            screenSubscriberProperties,
            (error: any) => {
                if (error) {
                    console.log(error);
                } else {
                    //code to rearrange UI
                }
            }
        );
    } else {
    }

但是随后在发布者上实际上未发布,而不是publishVideo(false)

this.openTokSession.unpublish(this.screenSharingPublisher);

然后监听此事件:

    this.openTokSession.on("streamDestroyed", (event:any) => {
        if(typeof(event.stream) !== 'undefined') {
            if(event.stream.videoType === 'screen') {
                //code to rearrange UI
                if (event.reason === 'mediaStopped') {
                    // User clicked stop sharing
                } else if (event.reason === 'forceUnpublished') {
                    // A moderator forced the user to stop sharing.
                }    
            } else {
                //deal with unpublished camera stream
            }

        }
    });

1 个答案:

答案 0 :(得分:0)

此处是TokBox开发人员的传播者。

作为订阅者,要知道何时禁用流的视频,您应该侦听订阅者对象上的videoDisabled事件。

您似乎在回调内的订户对象上设置了事件侦听器,这就是事件未触发的原因。您应该在回调函数之外具有以下内容:

subscriber.on('videoDisabled', event => {
   console.log('video disabled ', event);
});

请注意,session.subscribe方法具有回调函数,因此您可以在订阅时知道是否存在同步错误,但是无论错误如何,该方法仍将返回订阅者对象。