Skip to main content

How to Build a Virtual Situation Room with Eyeson (Part 2)

· 4 min read
Stefan Steinbauer

In the first part, we looked at creating the virtual situation room. Further, we looked at the authentication and users. We will now consider bringing the participants into the room and adding sources.

Connecting People to the Virtual Situation Room

As we learned in Part 1, there are multiple ways to admit people to the room. Let’s examine how they connect to the room.

  1. API Key user
    People or code pieces can use the API key to start a meeting. This is usually the host. Once the meeting has started, the user can use the link or access key from the API response to join.

  2. Access Key user
    This is a known user. You can create her/him by using the join method from the SDKs. The user name could be the email address or something similar. This way, you can pull names and other user data from your system and show them in the call.

    import Eyeson from 'eyeson-node';
    const eyeson = new Eyeson({ apiKey: '<YOUR_API_KEY>' });
    async function createUserWithAccessKey(username) {
    const user = await eyeson.join(username);
    return user.accessKey;
    }
  3. Guest user
    The guest user link does not require authentication but is only valid for the current session. Once the room is closed, the link will be invalid. Guests can be invited from the call interface with a shareable link or a QR Code. This allows any responder on the call to share the Virtual Situation Rooms for collaboration.

With Javascript SDK you can handle a lot of the options regarding users easily and fast.

import eyeson from 'eyeson';
eyeson.onEvent(event => {
if (event.type === 'add_user') {
console.log(event.user, event.initial);
}
});

/*
{
type: 'add_user',
user: {
id,
name,
avatar, // url to users avatar
guest: true | false
}
initial: true | false // initial connect or reconnect
}
*/

What if I don’t want the room to be that open?

You have two options:

  • Number 1 is to lock the room after everybody you want in has joined. This is the hard way to do, and it might not be feasible during an operation.

  • Number 2 is to remove the guest_join when creating the call. Ensure you have the option turned off in the payload of the POST request.

    options[guest_token_available]=false

Let’s assume that everyone is now on the call or at least has the link to join and move on to connecting the sources.

Adding image content to the Virtual Situation Room

The Eyeson Layer API provides a flexible system for adding dynamic visual elements to video meetings. All data that can be visualized can be added to the room. So if it can be an image, it can be added to the room. Be aware that a transparent foreground image shows the camera feeds.

It offers three main methods:

  • File: Direct image upload (also check out eyeson-node-layer on that)
  • URL: Link to an online image
  • Insert[content]: Server-generated text overlays

See some examples.

Key features:

  • Dynamic content (e.g., real-time clock overlays, maps with moving markers,...)
  • Support for text, images, and shapes
  • Customizable positioning and styling

Typical uses include images, maps, API data displays, and custom meeting overlays.

Implementation is straightforward using the sendLayer() function. While Node.js libraries are available, the core functionality is language-agnostic, allowing integration with various programming environments.

Connecting sources to the Virtual Situation Room

Some sources are different than others: They already have video streams. If you want to add bodycams, drones, and CCTV cameras, you must first bring their streams to the current meeting. We will use Eyeson Ghost as a proxy to do just that.

First, you need to install the release for your platform from GitHub. Afterward, you can run the Ghost to connect to the Video Meeting as a guest by entering the following line into a terminal

Run ghost RTMP server on Windows
./rtmp-server_windows_amd64.exe https://app.eyeson.team/?guest=[$GUEST_TOKEN]

Now, we have to connect the drone to the server by giving it the destination to stream to. Usually, that is port 1935 of the IP address on which the Ghost machine runs. It could be rtmp://192.168.0.1:1935/drones/alpha. Of course there is a parameter to change the port.

If you and the drone are in different networks, you could use ngrok to connect the drone to a public ngrok endpoint and then to the call.