首页 > 解决方案 > 如何在 OpenTok 屏幕共享订阅者中检测 publishVideo(false)

问题描述

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

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 是屏幕则不会:

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

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');
            });
        }
    }
});

...当我在相机的发布者上 publishVideo(false) 时,它确实会在该流的订阅者中导致 videoDisabled 事件。

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

我要尝试的下一件事是:Tokbox 屏幕共享问题,即在会话中取消发布以查看是否会产生我可以处理的事件。

编辑 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
            }

        }
    });

标签: angularopentoktokbox

解决方案


TokBox 开发者布道者在这里。

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

看起来您正在回调内的订阅者对象上设置事件侦听器,这就是事件未触发的原因。你应该在回调函数之外有这样的东西:

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

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


推荐阅读