angular - 如何在 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
}
}
});
解决方案
TokBox 开发者布道者在这里。
作为订阅者,要知道流的视频何时被禁用,您应该videoDisabled
在订阅者对象上监听事件。
看起来您正在回调内的订阅者对象上设置事件侦听器,这就是事件未触发的原因。你应该在回调函数之外有这样的东西:
subscriber.on('videoDisabled', event => {
console.log('video disabled ', event);
});
请注意,该session.subscribe
方法带有一个回调函数,因此您可以知道订阅时是否存在同步错误,但无论错误如何,该方法仍将返回订阅者对象。
推荐阅读
- google-apps-script - 如何使用 Google 脚本从电子表格的选定单元格区域生成 PDF?
- go - Gin-Gonic 内容类型限制
- javascript - 如何在javascript中使用for循环生成图像数组?
- machine-learning - 如何使用 Python 去除异常值
- node.js - 执行位于主机环境链接卷内的脚本
- firebase - 执行 Firebase google sign_in 时出错
- c++ - 按第一个元素推导初始化列表的类型
- python - 具有至少 3 个大写字母的正则表达式 Python
- php - Symfony 4.3 Mailer - “Symfony\Component\Mime\Header\Headers”类的名为“getAll”的未定义方法
- c++ - 结构不在内存中