Use your own launcher

You can put your own launcher in front of your Unreal app on Eagle 3D Streaming — an exe that runs first, does whatever you need, and then starts the app. There is no setting for it: it works because of how Eagle 3D Streaming picks the exe it starts. This post explains that behaviour, how to use it when you prepare your zip, and what your launcher has to do so the stream still works.

1. How Eagle 3D Streaming picks the exe to start

The exe at the top of your zip with your app's name, beside the Unreal exe

Eagle 3D Streaming expects one exe at the top of your zip with the same name as your app — the name you upload the build under. Whatever exe has that name is the one it starts. It does not check that the exe is an Unreal app.

So when you prepare the zip for upload, you can use this expected behaviour: give your launcher the app's name and put it at the top of the packaged Unreal build, in the same folder as the Unreal exe. Leave everything Unreal made where it is. The system then starts your launcher instead of the Unreal exe. For an app uploaded as MyApp:

MyApp.exe                 <- your launcher, with the app's name
MyProject.exe             <- the packaged build's exe, exactly as Unreal made it
Engine\
MyProject\
    Content\
        Paks\

Two things matter:

  • The name. The launcher must be called exactly like the app name you upload under (MyApp → MyApp.exe). So the app name must not be your Unreal project's name (here MyApp, not MyProject) — otherwise the launcher and the Unreal exe would need the same file name.
  • The place. The launcher sits at the top, beside the Unreal exe, and Engine\ and your project folder stay exactly where Unreal put them. Do not move the Unreal build into a subfolder: the upload's test launch looks for your project's Content folder one level below the top.

This is the only layout supported for now. We will make it more flexible later (for example a launcher in its own folder, or with any name). Need that sooner? Contact support (Email / Discord).

Your launcher cannot stream by itself

The stream comes from the Unreal app: it is the app, with its Pixel Streaming plugin, that sends the video. Your launcher only stands in front of it. So once it has done its own work, your launcher has to start the Unreal app — and start it the right way, as section 2 explains.

2. What the launcher must do

Four rules, and what breaks if one is missed
rulewhyif it is missed
Start the Unreal app with every argument the launcher received, unchanged They tell the app where to stream to, at what resolution and quality The app starts but no video reaches the viewer
Keep running while the app runs Eagle 3D Streaming watches the exe it started A launcher that exits after starting the app looks like an app that stopped: the session ends
Exit with the app's exit code when the app stops That is how a crash is told apart from a normal end Crashes are reported as normal ends, or the other way round
Give the launcher exe a file version of 5.1 or higher — best, your Unreal Engine version (e.g. 5.4.4.0) Eagle 3D Streaming reads the Windows file version (VERSIONINFO, File version) of the exe it starts as the Unreal Engine version, and refuses Unreal Engine 4 (every Unreal Engine 5 version, 5.0 included, is accepted). An exe with no file version is refused too The session never starts; the viewer sees “old verison 1.0.0.0 not suppoted for now” (with your launcher's version). Check it in Windows: right-click the exe → Properties → Details → File version

When the viewer leaves, Eagle 3D Streaming stops the launcher together with every process it started, so the Unreal app stops with it.

If the launcher stops or crashes during the stream

Eagle 3D Streaming watches the exe it started — your launcher — not the Unreal app behind it. If the launcher ends, the system treats that as the app ending, even though the Unreal app may still be running. We tried it by stopping only the launcher in the middle of a stream:

  • about 4 seconds later the viewer's page showed "App Crashed – Try again", and the session was reported as a crash, with the launcher's exit code;
  • the Unreal app it had started was left running on its own for about a minute and a half before it stopped.

So the launcher has to be at least as stable as the app: keep its own work small, catch its own errors, and never exit while the app is running.

3. Try it with our demo: download, upload, stream

A complete build with the launcher already in front

Download the launcher demo (zip, 445 MB). It is a complete build you can upload as it is: our demo launcher luncherDemo.exe beside a packaged Unreal app (the E3DS Starter App), in the layout above. Already have your build ready? Take luncherDemo.exe and launcher.json from it and put them beside your own Unreal exe.

See it running first: open the launcher demo's stream. This is the same zip, uploaded as the app luncherDemo: Eagle 3D Streaming starts luncherDemo.exe, which starts the Unreal app, which streams to you.

First, upload it as it is

  1. Upload the zip from the Control Panel as usual, with the app name luncherDemo — the same name as the launcher, luncherDemo.exe.
  2. Open the app's link. The launcher starts, waits 2 seconds, then starts the Unreal app, and the stream plays.

Then look inside

Extract the zip into a folder. This is what you get:

luncherDemo.exe           <- the launcher, started first
launcher.json             <- tells the launcher which exe to start
README.txt
E3DS_StarterApp.exe       <- the packaged Unreal app's exe
Engine\
FeaturesPluginDemo56\     <- the Unreal project folder (Content\Paks inside)

Put your own app beside the launcher

  1. Delete E3DS_StarterApp.exe, Engine\ and FeaturesPluginDemo56\, and copy your own packaged build into the same folder: your <Project>.exe, Engine\ and <Project>\, exactly as Unreal made them.
  2. Edit launcher.json so exe names your app's exe: { "exe": "MyProject.exe", "waitSeconds": 2 }
  3. Rename luncherDemo.exe to the app name you will upload under, e.g. MyApp.exe — a name that is not your project's name.
  4. Zip the folder's contents — the launcher must be at the top of the zip, not inside another folder — and upload it with that app name (MyApp).

launcher.json

fieldwhat it does
exeRequired. Which exe to start, as a path relative to the launcher's own folder, so it works wherever the build is unpacked. Use forward slashes. A path that leaves the folder (../, a drive letter) is refused.
workingFolderOptional. The folder the app starts in, relative too. Default: the exe's own folder.
waitSecondsOptional. How long to wait before starting the app, standing in for your own launcher's work. Default 2.

If launcher.json is not valid JSON or points at an exe that is not there, the launcher says which in its window and in launcher.log, and stops.

4. Troubleshooting

The upload fails its test launch

The upload's test launch fails

Check the layout first: the launcher, named exactly like the app, at the top of the zip beside the Unreal exe, with Engine\ and your project folder (with Content\ inside) next to it. A zip with the Unreal build moved into a subfolder, or with everything inside one extra top folder, does not pass the test launch. Then check the four rules in section 2 — most often the file version (5.1 or higher), or a launcher that exits right after starting the app.

Pak files

Before the app starts, Eagle 3D Streaming puts your pak files (patches) into the project's Content\Paks folder, which it finds one level below the top of your build. In the layout above that is MyProject\Content\Paks, so pak files work with a launcher as they do without one.

Related

Last updated