Overview
Since build 5.2.935 in is possible to send an event from publishing client which is biund to the stream published, and to pass the event to all the stream subscribers. Today, the feature is used to notify subscribers when publisher mutes/unmutes audio/video.
Sending stream event from publiher
Audio/video state notification: muted/unmuted
Stream audio state notifications are sending when Stream.muteAudio() and Stream.unmuteAudio() are called as follows:
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 video state notifications are sending when Stream.muteVideo() and Stream.unmuteVideo() are called:
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); } };
Sending data to all the subscribers from publishing client
Since WCS build 5.2.942 and WebSDK build 2.0.168 it is possible to send any data in JSON format from publishing client to all the subscribers of stream published. To do this, Stream.sendData() method should be invoked, for example
stream.sendData({"number":33,"string":"hello",boolean:true});
Sending stream event from server
Since WCS build 5.2.944 it is possible to send an event with JSON data to all the stream subscribers from server using REST API.
REST query should be HTTP/HTTPS POST query like this:
- HTTP: http://test.flashphoner.com:8081/rest-api/stream/event/send
- HTTPS: https://test.flashphoner.com:8444/rest-api/stream/event/send
Where:
- test.flashphoner.com - WCS server address
- 8081 - standard REST / HTTP port
- 8444 - standard HTTPS port
- rest-api - mandatory part of the URL
- /stream/event/send - REST method used
REST queries and response states
REST query | REST query body example | Responce states | Description |
---|---|---|---|
/stream/event/send | { "streamName":"test", "payload":{ "number":33, "string":"hello", "boolean":true } } | 200 - OK 404 - Stream not found 500 - Internal server error (bad JSON) | Send data to all the stream subscribers |
Parameters
Name | Description | Example |
---|---|---|
streamName | Имя потока | test |
payload | Данные в формате JSON | {"number":33,"string":"hello","boolean":true} |
If the stream published on server has no subscribers, then the query will return 200 OK, but the event will not be sent to anyone
Receiving stream event on subscribers side
When stream event is passed, all the subscribers receive the STREAM_EVENT event
previewStream = 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); });
Since WCS build 5.2.942 and WebSDK build 2.0.168 the event type STREAM_EVENT_TYPE.DATA is added, to receive JSON data sent by stream.sendData() or by /stream/event/send REST query
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();
Stream event processing on backend
To process stream events on backend server, sendStreamEvent and StreamEvent methods should be added to the application
add app-rest-method MyAppKey sendStreamEvent add app-rest-method MyAppKey StreamEvent
Then backend server will receive 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", "info" : "", "origin" : "https://wcs:8888" }
if publisher mutes the stream.
Also, backend will receive StreamEvent per every the stream subscriber
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", "info" : "" }