Я подписываюсь на поток демонстрации экрана следующим образом:
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.info(error);
} else {
screenSubscriber.on("videoDisabled", (event: any) => {
console.info('videoDisabled1')
});
}
}
);
} else {
//it's normal video
}
});
Вы увидите, что я пытаюсь прослушать videoDisabled
на указанном выше подписчике, но также пробовал это в сеансе здесь:
this.openTokSession.on("videoDisabled", (event: any) => {
console.info('videoDisabled1')
if (typeof(event.stream) !== 'undefined') {
if (event.stream.videoType === 'screen') {
console.info('videoDisabled2');
}
}
});
... но ни одно событие не срабатывает, несмотря на то, что я вижу, что демонстрация экрана прекращается, когда издатель вызывает publishVideo(false)
.
Может ли кто-нибудь дать мне какие-либо указатели на то, какое событие я должен слушать, и находится ли оно в потоке или в сеансе?
EDIT в ответ на сообщение @ Manik
Похоже, что publishVideo (false) действительно приводит к тому, что событие videoDisabled становится доступным для подписчика, ЕСЛИ videoType является камерой, но не, если videoType является экраном:
В том же приложении (в том же сеансе) у меня также есть:
var subscriberProperties = {
insertMode: 'append',
width: '100%',
height: '100%'
};
var subscriber = this.openTokSession.subscribe(event.stream,
subscriberDivId,
subscriberProperties,
(error: any) => {
if (error) {
console.info(error);
} else {
subscriber.on('videoDisabled', (event: any) => {
console.info('videoDisabled');
});
}
}
});
... и когда я публикуюVideo (false) на издателе для камеры, это действительно вызывает событие videoDisabled у подписчика на этот поток.
Мое текущее мнение состоит в том, что либо есть ошибка в срабатывании события потока демонстрации экрана, либо что, возможно, publishVideo (false) не подходит для потока совместного использования экрана.
Следующее, что я собираюсь попробовать, это следующее: Проблема с показом экрана в Tokbox, то есть отмена публикации в сеансе, чтобы увидеть, не вызывает ли это событие I может handle.
Обновлено еще раз: Для всех, кто борется с этим, не решена исходная проблема - мое плохое кодирование или неожиданное поведение с 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.info(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.info('video disabled ', event);
});
Обратите внимание, что метод session.subscribe
принимает функцию обратного вызова, чтобы вы могли узнать, была ли синхронная ошибка при подписке, но независимо от ошибки метод все равно вернет объект подписчика.
Я боюсь, что это все еще не работает - размещение прослушивателя событий screenSubscriber чуть ниже и за пределами оператора var screenSubscriber - какие-либо подсказки для отладки, что происходит не так, например, способ узнать, какие события запускаются?
Может ли какая-то разница, что у меня одновременно работает нормальный поток с камеры?
@theotherdy Я не уверен, почему это не работает для вас. Можете ли вы проверить следующий пример кода и посмотреть, работает ли он для вас? jsfiddle.net/jkmo7svn/2
Спасибо @Manik. Мне интересно, не является ли запуск события videoDisabled специфичным для источника видео на экране? В моем приложении уже есть код, который успешно прослушивает audioLevelUpdated на подписчике камеры. Я очень хочу продолжить с этим - есть ли какой-нибудь метод, который я могу вызвать у издателя, чтобы остановить совместное использование экрана, которое вызовет событие в сеансе вместо потока?
@theotherdy Приносим извинения за задержку - похоже, это ошибка в SDK. Я передал это команде и сообщу вам, как только это будет исправлено. Чтобы уточнить, это происходит только тогда, когда источником видео потока является экран.
Спасибо @Manik - я попробую это сегодня вечером, хотя есть ощущение, что я пробовал это и за пределами функции обратного вызова, но, возможно, ссылка на screenSubscriber больше не входит в сферу действия ...