Live connection state (stream statistics)

The live connection state (stream statistics) is the live view of how well the video is reaching a viewer in an Eagle 3D Streaming session: round trip, lost packets, jitter, bitrate, frame rate and picture size. It is measured on the real path between the viewer and the streaming machine, from the moment the video starts, and your page receives the numbers every 5 seconds. What counts as good is your decision: your page reads the numbers and applies its own rules.

At a glance

WhereHow you get itWhen
Streaming pagethe Info button on the stream's settings barwhile the video plays, updated live
iframethe message {type: "connection.stats", ...} sent to your pagefrom the first video frame, every 5 seconds
Web SDKthe callback e3ds_controller.callbacks.onConnectionStatsfrom the first video frame, every 5 seconds

Only after the video starts. The numbers come from the video itself, so there is nothing to report before the first frame. To check a connection before that, see Connection speed and health.

How to get it

Streaming page

On the Eagle 3D Streaming page itself, open the settings bar and press Info. The panel shows the network round trip, data received, resolution, frame rate, codec and bitrate, updated while the video plays. Nothing to set up. See the settings bar.

iframe

Embed the stream as described in Embed with an iframe, then listen for the message on your page:

window.addEventListener("message", function (e) {
  if (e.data && e.data.type === "connection.stats") {
    showQuality(e.data);   // the numbers: rttMs, fps, packetLossPercent, ...
  }
});

How often: every 5 seconds by default. To change it, send the frame a command with a number of seconds from 1 to 60, or 0 to stop:

document.getElementById("e3ds").contentWindow.postMessage(
  JSON.stringify({ cmd: "setConnectionStatsInterval", seconds: 2 }), "*");

Web SDK

Set up the page as described in Embed with the Web SDK, then add the callback:

e3ds_controller.callbacks.onConnectionStats = function (stats) {
  showQuality(stats);   // the same numbers as in the iframe
};

How often: every 5 seconds by default. To change it (1 to 60 seconds, or 0 to stop):

e3ds_controller.setConnectionStatsInterval(2);

Does a shorter interval cost anything? No noticeable cost. Nothing extra is sent to your Unreal app, so it has no extra work. The reports reuse numbers the browser already collects about once a second, so a report every 2 seconds instead of 5 adds only a small message to your page.

What each number means

Every report carries the same fields, for example:

{ "type": "connection.stats", "rttMs": 48, "packetLossPercent": 0.2, "jitterMs": 3,
  "bitrateKbps": 6200, "fps": 60, "framesDropped": 0, "resolution": "1920x1080", "intervalSeconds": 5, "time": "2026-10-14T13:39:34.849Z" }
fieldwhat it iswhat to look for
rttMsRound trip between the viewer and the streaming machine, in milliseconds: how long a click takes to reach the app and its result to come back.Under 100 feels instant. Over 250 is noticeably slow to respond.
packetLossPercentVideo packets lost since the previous report, in percent. null on the first report.Up to 1% is normal. Over 5% shows as stutter or blur.
jitterMsHow unevenly the packets arrive, in milliseconds.A few milliseconds is normal. Tens of milliseconds means an unsteady connection.
bitrateKbpsVideo received right now, in kilobits per second.It follows the picture: a still scene needs much less than a moving one, so a low value alone is not a problem.
fpsFrames per second the viewer sees.25 or more is smooth. Under 15 looks choppy.
framesDroppedFrames the viewer's browser dropped since the previous report.Steady drops point at the viewer's device, not the connection.
resolutionThe picture size shown, for example 1920x1080. 
intervalSecondsHow often reports are coming. 
timeWhen this report was made. 

A number the viewer's browser did not report is null.

Two different things: response and picture

The numbers describe two separate experiences, and one can be poor while the other is good. A poor round trip does not mean a poor picture: it means the viewer's keyboard, mouse and touch input reach the app late, so the app feels slow to react, even if the picture looks sharp. A poor picture (blurry, choppy) can happen on a connection that responds instantly.

Response: how fast the app reacts to keyboard, mouse and touch

fieldgoodfairpoorwhat poor feels like
rttMsup to 100101 to 250over 250a click or key press shows its result a quarter of a second or more later; the camera trails the mouse
jitterMsup to 2021 to 50over 50response is uneven: sometimes quick, sometimes late

Picture: how the video looks and moves

fieldgoodfairpoorwhat poor looks like
fps25 or more15 to 24under 15choppy movement
packetLossPercentup to 11 to 5over 5blocky patches, short freezes
framesDropped (per report)0 to 56 to 30over 30stutter caused by the viewer's device, not the connection
bitrateKbps, at 1920x1080 in a moving scene4000 or more1500 to 4000under 1500soft, smeared detail. A still scene needs far less, so judge it only while the picture moves

resolution tells you the picture size these numbers apply to; a smaller window needs proportionally less bitrate for the same sharpness.

Sample rules you can copy

Eagle 3D Streaming sends the numbers, not a verdict: what is good depends on your app (a walkthrough tolerates more delay than a game). Start from these samples and change the limits to suit your app. They use the values from the two tables above.

// Response: how fast the app reacts to keyboard, mouse and touch
function responseRating(s) {
  if (s.rttMs === null) return "unknown";
  if (s.rttMs <= 100) return "good";
  if (s.rttMs <= 250) return "fair";
  return "poor";
}

// Picture: how the video looks and moves
function pictureRating(s) {
  var loss = s.packetLossPercent || 0;
  if ((s.fps !== null && s.fps < 15) || loss > 5) return "poor";
  if ((s.fps === null || s.fps >= 25) && loss <= 1) return "good";
  return "fair";
}

Two separate results let you tell the viewer the right thing: "slow to respond" (response) is a different problem from "low picture quality" (picture).

Troubleshooting

What you seeWhyWhat to do
No reports at allThe video has not started yet, or the interval was set to 0.Reports start with the first frame. Send a new interval (1 to 60) to restart them.
iframe: reports never reach your listenerThe listener is on a different window, or filters the wrong field.Listen on your page's own window and check e.data.type === "connection.stats".
Some fields are nullThat browser does not report the number (Safari reports fewer).Treat null as unknown in your own rules.
You need other numbers Ask support (Email / Discord).

Related

Last updated