Millicast WebRTC Group Call

WebRTC Conferencing for Millicast. Master with merger.

Layouts

Note: Not a live demo, server configuration is just for example. For live working example try the Millicast Publisher and Subscriber example. Or AWS Kinesis Publisher and Subscriber example.

Note: Not a live demo, server configuration is just for example. For live working example try the Millicast Publisher and Subscriber example. Or AWS Kinesis Publisher and Subscriber example.

Note: To feature a participant select them first or add their stream name to the api method arguments. Toggle the room view to show the video merger view.

WebRTC Conferencing configuration for Millicast. The account ID and publish token is required to be configured. A static list of Ice servers is also required. See documentation for obtaining a publish token for the stream setup in the console.

Conferencing master with graphics accelerated stream merger broadcasting and recording features. Using the conferencing plugin an api is provided to feature and mute a selected participant.

When configuring the publish token subscriber authentication can be selected. A supplied script is supplied to generate the subscriber token with domain restriction. That can be used to configure the subToken config. See the Millicast API Docs for generating these tokens.

Millicast supports WebRTC data channels which can be enabled with dataChannel and channelName

Supplied is a demo WebSocket signalling node server. To provide group room features for Millicast. Within the signal server, this will do a client call to the Millicast API to obtain a subscribe stream. The endpoint for this service is groupcall

The config roomName is required to connect to a specific room.

    <div class="flex w-full h-auto my-auto">
          <div id="millicast-conference-master" class=""></div>
  </div>
  <script type="text/javascript">
  	var player = jwplayer("millicast-conference-master").setup({
    "aspectratio": "16:9",
    "playbackRateControls": true,
    "plugins": {
        "../../js/webrtcconference-8.20.0.js": {
            "autoPublish": true,
            "bgImage": "../../images/virtualbg.jpg",
            "container": "#conference-container",
            "enableFocus": true,
            "featuredContainer": "#featured-container",
            "fullscreenFeatured": true,
            "host": true,
            "lobbyContainer": "#conference-participant-container",
            "lobbyPlayerTemplate": "<div id=\"${id}\" class=\"conference-player conference-lobby-player group flex justify-center items-center\"><div id=\"${playerid}\"></div><button class=\"invisible group-hover:visible bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-2 absolute font-semibold bg-gradient-to-tr from-iblue-default hover:from-iblue-light to-iblue-light hover:to-iblue-default text-white focus:shadow-outline focus:outline-none text-sm\" x-data=\"{ staged: ${staged} }\" x-text=\"staged ? 'Remove' : 'Add To Room'\" @click.prevent=\"addToRoom($event);\" data-name=\"${name}\">Add To Room</button></div>",
            "logo": "../../images/wowza-logo.png",
            "mergerContainer": "#conference-merge-container",
            "mergerOnly": false,
            "playerTemplate": "<div id=\"${id}\" class=\"conference-player\"><div id=\"${playerid}\"></div></div>",
            "profile": "../../images/wowza-logo.png",
            "roomContainer": "#room-container",
            "studioMode": true
        },
        "../../js/webrtcmerger-8.20.0.js": {
            "autoPublish": true,
            "bgImage": "../../images/virtualbg.jpg",
            "enableFocus": true,
            "master": true,
            "mergerContainer": "#conference-merge-container"
        },
        "../../js/webrtcpeakmeter-8.20.0.js": {
            "verticalMeter": false
        },
        "../../js/webrtcpublisher-8.20.0.js": {
            "autoStartDevice": true,
            "buttons": false,
            "iceServers": [
                {
                    "urls": [
                        "stun:stun.l.google.com:19302",
                        "stun:stun1.l.google.com:19302",
                        "stun:stun2.l.google.com:19302",
                        "stun:stun3.l.google.com:19302",
                        "stun:stun4.l.google.com:19302"
                    ]
                }
            ],
            "meterAutoStart": false,
            "millicast": {
                "accountId": "huaHNT",
                "codec": "h264",
                "publishToken": "ccd5e3c8dfaa833955fa46fe91b0537bc26a6959316fc02038476749524721c4",
                "roomServerURL": "rtc.electroteque.org:8444/groupcall",
                "subToken": "6d3eddde5f64f5f3a699a4b5eb05fe58c2b4d91887c46820ad79189f1295163d"
            },
            "opus": {
                "usedtx": 1
            },
            "publisher": true,
            "roomName": "room1",
            "seperateScreen": true,
            "server": "millicast-conference"
        }
    },
    "sources": [
        {
            "appName": "webrtc",
            "file": "room-C6Lx6ku6FEXgKtt",
            "live": true,
            "publisher": true,
            "type": "mp4"
        }
    ],
    "title": "Host",
    "width": "100%"
});

player.on("ready", function() {
player.on("selectedParticipant", (participant) => {
console.log("selected participant", participant);
}).on("unselectedParticipant", (e, participant) => {
console.log("unselected participant", participant);
}).on("participantleft", (sender) => {
}).on("participantfeatured", (sender) => {
}).on("participantunfeatured", (sender) => {
}).on("leaveroom", e => {
}).on("roomjoinfailed", e => {
}).on("existingparticipants", (sender) => {
}).on("roomPlayer", (e, item) => {
console.log("Room Player ", item);
}).on("participantPlayer", (e, item) => {
console.log("Lobby Player ", item);
}).on("roomConfig", (e, state, config) => {
console.log("Room Config ", state, config);
});
});
  </script>