В сборке 5.2.935 добавлена возможность отправки с клиента события, привязанного к публикуемому потоку, и передачи этого события всем подписчикам. В настоящее время эта возможность используется для оповещения подписчиков о том, заглушено ли аудио/видео на публикующей стороне.
Оповещения об изменении состояния аудио отсылаются следующим образом, при вызове функций Stream.muteAudio() и Stream.unmuteAudio():
var muteAudio = function muteAudio() { if (mediaConnection) { mediaConnection.muteAudio(); sendStreamEvent(STREAM_EVENT_TYPE.AUDIO_MUTED); } }; ... var unmuteAudio = function unmuteAudio() { if (mediaConnection) { mediaConnection.unmuteAudio(); sendStreamEvent(STREAM_EVENT_TYPE.AUDIO_UNMUTED); } }; |
Аналогично, при вызовах Stream.muteVideo() и Stream.unmuteVideo() отсылаются события об изменении состояния видео:
var muteVideo = function muteVideo() { if (mediaConnection) { mediaConnection.muteVideo(); sendStreamEvent(STREAM_EVENT_TYPE.VIDEO_MUTED); } }; ... var unmuteVideo = function unmuteVideo() { if (mediaConnection) { mediaConnection.unmuteVideo(); sendStreamEvent(STREAM_EVENT_TYPE.VIDEO_UNMUTED); } }; |
В сборке WCS 5.2.942 и сборке WebSDK 2.0.168 добавлена возможность отправки любых данных с публикующего клиента в формате JSON всем подписчикам опубликованного потока. Для этого необходимо вызвать метод Stream.sendData(), например
stream.sendData({"number":33,"string":"hello",boolean:true}); |
В сборке WCS 5.2.944 добавлена возможность отправки события всем подписчикам потока с сервера по REST API.
REST-запрос должен быть HTTP/HTTPS POST запросом в таком виде:
Здесь:
REST-метод | Пример тела REST-запроса | Статусы ответа | Описание | |
---|---|---|---|---|
/stream/event/send |
| 200 - OK 404 - Stream not found 500 - Internal server error (bad JSON) | Отправить данные всем подписчикам потока |
Имя параметра | Описание | Пример |
---|---|---|
streamName | Имя потока | test |
payload | Данные в формате JSON | {"number":33,"string":"hello","boolean":true} |
Если поток опубликован на сервере, но не имеет ни одного подписчика, запрос вернет 200 OK, но событие никому не будет отослано
При передаче события, сигнализирующего об изменении состояния потока, подписчик получает событие STREAM_EVENT
session.createStream({ name: streamName, display: remoteVideo, ... }).on(STREAM_EVENT, function(streamEvent) { switch (streamEvent.type) { case STREAM_EVENT_TYPE.AUDIO_MUTED: $("#audioMuted").text(true); break; case STREAM_EVENT_TYPE.AUDIO_UNMUTED: $("#audioMuted").text(false); break; case STREAM_EVENT_TYPE.VIDEO_MUTED: $("#videoMuted").text(true); break; case STREAM_EVENT_TYPE.VIDEO_UNMUTED: $("#videoMuted").text(false); break; } console.log("Received streamEvent ", streamEvent.type); }).play(); |
В сборке WCS 5.2.942 и сборке WebSDK 2.0.168 добавлен тип STREAM_EVENT_TYPE.DATA для получения данных в формате JSON, отосланных функцией stream.sendData() или REST запросом /stream/send/event
session.createStream({ name: streamName, display: remoteVideo ... }).on(STREAM_EVENT, function(streamEvent) { switch (streamEvent.type) { case STREAM_EVENT_TYPE.DATA: console.log(JSON.stringify(streamEvent.payload)); break; } }).play(); |
Начиная со сборки 5.2.966, подписчик, играющий выходной поток микшера, получает события, связанные с одним из входящих потоков микшера. При этом в объект payload
добавляется поле streamName
, чтобы показать, к какому именно потоку относится событие
session.createStream({ name: streamName, display: remoteVideo, ... }).on(STREAM_EVENT, function(streamEvent) { let mutedName=""; if(streamEvent.payload !== undefined) { mutedName=streamEvent.payload.streamName; } switch (streamEvent.type) { case STREAM_EVENT_TYPE.AUDIO_MUTED: $("#audioMuted").text(true + " " + mutedName); break; case STREAM_EVENT_TYPE.AUDIO_UNMUTED: $("#audioMuted").text(false + " " + mutedName); break; case STREAM_EVENT_TYPE.VIDEO_MUTED: $("#videoMuted").text(true + " " + mutedName); break; case STREAM_EVENT_TYPE.VIDEO_UNMUTED: $("#videoMuted").text(false + " " + mutedName); break; } console.log("Received streamEvent ", streamEvent.type); }).play(); |
При подключении к потоку, подписчик может определить, заглушена аудио/видео дорожка в потоке или нет, при помощи методов Stream.getAudioState() и Stream.getVideoState() в обработчике события STREAM_STATUS.PLAYING:
session.createStream({ name: streamName, display: remoteVideo, ... }).on(STREAM_STATUS.PLAYING, function (stream) { if (stream.getAudioState()) { $("#audioMuted").text(stream.getAudioState().muted); } if (stream.getVideoState()) { $("#videoMuted").text(stream.getVideoState().muted); } ... }).play; |
Начиная со сборки WCS 5.2.1011, при подключении подписчика к выходному потоку микшера, он получает набор событий STREAM_EVENT на каждый входящий поток микшера, если хотя бы в одном из них аудио или видео было заглушено. При этом порядок получения этих событий не гарантируется и не зависит от порядка добавления потоков в микшер.
Для того, чтобы обработать событие об изменении состояния потока на бэкенде, к приложению должны быть добавлены методы sendStreamEvent и StreamEvent
add app-rest-method MyAppKey sendStreamEvent add app-rest-method MyAppKey StreamEvent |
Если аудио или видео было заглушено, бэкенд-сервер получит событие sendStreamEvent
URL:http://localhost:8081/apps/EchoApp/sendStreamEvent OBJECT: { "nodeId" : "qg4BeHzYSAtkhUkXgnSMEUZpsshaLPL5@192.168.0.39", "appKey" : "defaultApp", "sessionId" : "/192.168.0.83:64573/192.168.0.39:8443-a98bb891-aeaf-46a8-8fba-772e07ac035b", "mediaSessionId" : "9906b2b0-9c28-11eb-8d20-75f877676678", "type" : "audioMuted", "origin" : "https://wcs:8888" } |
Также бэкенд-сервер получит событие StreamEvent для каждого подписчика этого потока
URL:http://localhost:8081/apps/EchoApp/StreamEvent OBJECT: { "nodeId" : "qg4BeHzYSAtkhUkXgnSMEUZpsshaLPL5@192.168.0.39", "appKey" : "defaultApp", "sessionId" : "/192.168.0.83:64573/192.168.0.39:8443-a98bb891-aeaf-46a8-8fba-772e07ac035b", "mediaSessionId" : "9fed5c50-9c28-11eb-8d20-75f877676678", "type" : "audioMuted" } |
Если подписчикам потока были отправлены данные со стороны публикующего клиента или с сервера, бэкенд-сервер получит событие sendStreamEvent
URL:http://localhost:8081/apps/EchoApp/sendStreamEvent OBJECT: { "nodeId" : "qg4BeHzYSAtkhUkXgnSMEUZpsshaLPL5@192.168.0.39", "appKey" : "defaultApp", "sessionId" : "/192.168.0.83:64573/192.168.0.39:8443-a98bb891-aeaf-46a8-8fba-772e07ac035b", "mediaSessionId" : "9906b2b0-9c28-11eb-8d20-75f877676678", "type" : "data", "payload" : { "count" : 23 }, "origin" : "https://wcs:8888" } |
Также бэкенд-сервер получит событие StreamEvent для каждого подписчика этого потока
URL:http://localhost:8081/apps/EchoApp/StreamEvent OBJECT: { "nodeId" : "qg4BeHzYSAtkhUkXgnSMEUZpsshaLPL5@192.168.0.39", "appKey" : "defaultApp", "sessionId" : "/192.168.0.83:64573/192.168.0.39:8443-a98bb891-aeaf-46a8-8fba-772e07ac035b", "mediaSessionId" : "9fed5c50-9c28-11eb-8d20-75f877676678", "type" : "data", "payload" : { "count" : 23 } } |