iframe demo manual

A manual for the running Eagle 3D Streaming iframe demo. No account, no key, nothing to download — open the page and every control described here is in front of you. When you want the code, there is one link at the bottom.

It is the same panel as the Web SDK demo

Deliberately. The two demos show the same controls over two different transports, so you can open them side by side and see that the difference is the wiring, not the features. Everything below has a counterpart in the Web SDK demo manual, usually with the same label.

In this demoIn the SDK demo
a message posted at the framea JavaScript call on e3ds_controller
{ cmd: "setVolume", value: 0.5 }e3ds_controller.setVolume(0.5)
an event arrives as a messagea callback you assigned is called

Why the controls arrive at different times

The panel fills in rather than appearing complete. That is deliberate, and it is the first real thing this demo teaches: a control that cannot work yet is not shown yet.

AppearsNeedsWhich controls
Alwaysnothing Restart stream, the Stream URL field, the permission rows
Once the channel is opena two-way link to the application Show FPS, streaming graphs, the console command box, Device info, messages to your app
Once frames arrivea picture to act on quality, resolution, volume, mouse, keyboard, fullscreen, screenshot, Terminate

The log, which is the most useful thing here

Everything this page sends into the stream, and everything that comes back, appears in the Log panel — newest first, with an arrow saying which direction it went.

It answers the question every integration eventually asks: did that actually arrive? A message posted at a frame that nothing handles fails in complete silence, so watching the log while you press a control is the difference between debugging and guessing.

The panel, control by control

Picture

ControlWhat it does
Quality: Low / Medium / High / Ultra The four named levels, the same ones the viewer's own quality menu offers. A level is the portable unit — the platform resolves it to whichever encoder scale the running plugin uses.
Quality: HD and Quality point (QP) A raw quantisation parameter: lower is a better picture and more bandwidth. Useful when you know which plugin you are on and want a specific number.
Adaptive quality A minimum and a maximum instead of a point; the encoder moves between them as the network allows. Not in effect yet from an iframe on the current production player — the button sends the command, and nothing changes.
1920 × 1080, 800 × 600, Custom resolution Pins the stream to a fixed size, whatever the frame is doing. 1280x720, 1280 720 and 1280, 720 all work.
Match window resolution Releases the pin and follows the frame again — the default, so it is also how you undo the three above.

Sound and window

ControlWhat it does
Volume Acts on the player inside the frame. Raising it from silent may be refused until the viewer has clicked something — browsers block audio that starts without a gesture, and that refusal is invisible from the parent page.
Fullscreen This one is done by the page, not the stream: the demo calls requestFullscreen() on the iframe element. Nothing is sent anywhere, which is why it keeps working when the session has ended.
Screenshot Captures the current frame inside the player and downloads it. The parent page cannot do this itself — a cross-origin frame's pixels are not readable from outside — so it is a command, not a browser call.

Input

ControlWhat it does
Mouse: Hovering / Locked How the mouse drives the camera. Locked captures the pointer, as a first-person game does.
Key + Press / Hold / Release Types into the application from your own buttons. Press is one tap; Hold and Release are the pair you need for anything held, such as movement. This is how you build a WASD pad for a phone.
Touch input: on / off Turn it off when your own buttons sit over the stream on a phone, so a tap on your control does not also reach the app underneath it.
Press play Presses the player's own play button, for a page with its own start screen that does not want the viewer to click twice.

Diagnostics

ControlWhat it does
Show FPS Sends the Unreal console command stat fps. The counter is drawn by the application, inside the picture — which is why it appears in a screenshot.
Show streaming graphs The transport's own numbers: bitrate, packet loss, latency. Useful when the picture looks wrong and you want to know whether the network or the application is at fault.
Unreal console command Any command the app accepts at its own console — stat unit, r.ScreenPercentage 50. See the warning below before putting a box like this in a public page.
Device info Asks the platform what device the viewer is on, and the answer arrives as takeUserDeviceInfo — the same message an Unreal app gets when it asks.

Your app

Character and Skin appear only when the demo is streaming an application known to understand them, and that gating is worth understanding: those buttons send a message that means nothing to any other app, and a message that means nothing produces no error — just a button that appears broken.

Message to your app sends whatever you type: JSON if it parses, a plain string if it does not. That is the one to use the moment you point this demo at your own application — and what arrives at the other end needs something waiting for it, which is the Unreal side of sending and receiving data.

Session and connection

ControlWhat it does
Restart stream Reloads the frame, which starts a fresh session. Available even before there is a stream, because it is also how you recover from one that never started.
Terminate stream Ends the session deliberately and releases the machine. Nothing reconnects on its own.
Stream URL + Apply Points the demo at a different application without editing a file. What you type is remembered in your browser only.
Camera, Fullscreen rows What the page is willing to share with the frame, written into the allow attribute when it reloads. The state beside each one is what the browser currently thinks — the two are different things, and a denied permission cannot be undone by any attribute.

The microphone is a separate demo

e3ds.github.io/E3DS-Iframe-Demo/microphone/ is this same demo with the microphone built in: asking for the permission, choosing an input device, and the reasons both are harder than they look.

It is separate on purpose. A page that asks for a microphone costs every visitor a browser prompt, and most integrations do not need one. See choosing the microphone.

Like what you see?

Last updated