Videos: 1440p, 4K, node options and the wait to record

- Start recording lists 1440p and 4K, and Sound, Convert and Import
  after conversion, all on as in "Start recording...".
- Every resolution is at most 3840x2160. A camera wider than 16:9 is
  scaled down at 4K.
- Sound off leaves the picture alone. Convert and Import stop the
  upload short as for the editor recording. A released game ignores
  them.
- The game waits for the recording to start, so the first frame of
  the run is recorded.
- Development: 2062 editor checks.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
adminandClaude Opus 5.5 committed 2026-10-13 10:11:27 +02:00
1 parent 75c9b0f035
commit b4262e3198
2 files changed
+16 -6

No files matched your search

+1 -1
@@ -21,7 +21,7 @@ php tests/php/releases.test.php # the release stor
php tests/php/files.test.php # uploaded files in a folder per account (#344), the same way
php tests/php/videos.test.php # the video store, its queue and the worker (#402), with the
# real ffmpeg: the CI image and game-maker-video have it
node tools/seed-e2e.mjs && node tools/e2e.mjs # 2061 editor checks, screenshots in /tmp/gm-e2e-*.png
node tools/seed-e2e.mjs && node tools/e2e.mjs # 2062 editor checks, screenshots in /tmp/gm-e2e-*.png
GM_STEPS=20 node tools/e2e.mjs # or 1-12, or 6,20 — a subset while working on one step
./e2e.sh start [GM_STEPS] # the same run detached, see below
./e2e.sh status # live progress, or the last run's result
+15 -5
@@ -171,13 +171,14 @@ Two action nodes record what the game view shows, with what the master plays (#4
| Node | |
|---|---|
| **Start recording** | **name** (empty: `Recording 2026-10-11 16:42:05`, when it started), **resolution** (*Game view*, *720p*, *1080p*), **fps** (*60*, *30*) |
| **Start recording** | **name** (empty: `Recording 2026-10-11 16:42:05`, when it started), **resolution** (*Game view*, *720p*, *1080p*, *1440p*, *4K*), **fps** (*60*, *30*), **Sound**, **Convert**, **Import after conversion** (all three on, as in **Start recording…** below) |
| **Stop recording** | ends it and saves it |
- **The picture** is the camera's, nothing of what lies over it: no notice, no fullscreen button,
no performance overlay, no letterbox, no menu or window of the editor. *Game view* records at the
size the picture has on screen when the first frame is taken (at most 3840x2160), *720p* and
*1080p* at that height, the width from the camera's shape. A window smaller than that is no
size the picture has on screen when the first frame is taken, *720p* to *4K* at that height,
the width from the camera's shape. Either is at most 3840x2160: a camera wider than 16:9 comes
out at *4K* scaled down to 3840 wide, a little lower. A window smaller than that is no
loss: the frame is drawn into a picture of its own at its full size. Text and a camera shader
are drawn at the size of the screen, though, and are scaled up with it, so they come out softer.
The size holds for the whole recording.
@@ -186,6 +187,7 @@ Two action nodes record what the game view shows, with what the master plays (#4
drawn there flickered in its corner. The picture comes back from the graphics card a frame or
two later, without the editor waiting for it.
- **The sound** is what leaves the master behind its limiter, what you hear. Opus, 160 kbit/s.
With **Sound** off the file has the picture alone.
- **It goes on** through `Load scene` and `Restart game`. The editor's pause holds it and leaves the
paused time out; a game that pauses itself is still seen, so that is recorded. Another tab in
front of the Game tab does not stop it. Ending the run (Esc, `Stop game`) saves it.
@@ -194,14 +196,22 @@ Two action nodes record what the game view shows, with what the master plays (#4
time is left out too, for at most 3 s at a time. A `Start recording` right after
`Play composition` therefore begins with the composition's first picture, not with the empty
frames while its video loads.
- **The game waits for the recording to start.** Setting up the encoders takes a moment, in a
test about 0.17 s, and no frame can be taken meanwhile. So the run holds until they are ready,
for at most 3 s, as it holds for its videos at Play. A `Start recording` in `On start` therefore
has the first frame of the run, and one later on starts at the frame it ran in. The game stands
still on screen for that moment; a sound already playing goes on.
- **One at a time:** a second `Start recording` while one records is ignored and says so in the
log, and so does a `Stop recording` with none. In the editor run (*Run in editor*) the nodes only
write to the log.
- **In the editor** the recording goes up to the server like any upload and is converted to MP4.
Once that is done, and the run is over, it is a video asset of the project with its name, ready
for a sprite or for **Download** in its tab. The notice line says how far it is.
for a sprite or for **Download** in its tab. The notice line says how far it is. **Convert** and
**Import after conversion** stop it short of either step, as for the editor recording: it is
always uploaded, and the video picker has it.
- **In a released game** there is no project to put it in: the browser downloads it as an `.mkv`
when it ends. That file is the one the browser made (H.264 and Opus), not converted.
when it ends. That file is the one the browser made (H.264 and Opus), not converted; **Convert**
and **Import after conversion** do nothing there.
- **A file of 2 GB**, the most an upload may be, ends the recording and saves it, with a line in
the log. At 1080p60 that is roughly half an hour.
- **When the encoder cannot keep up**, a frame is left out rather than everything falling behind;