Frame recording: OGV, PNG and audio
Working CLI recording, frame counts, formats and result checks.
What Movie Maker does
Movie Maker runs a project with fixed timing and records its rendered window plus mixed audio. It records project output, not the desktop, and is not a video editor. Duration follows recorded frame count and FPS; computing those frames can take a different amount of wall-clock time.
Prepare a test project
Create a Control level, attach RecordingSlate.cs, build C# and assign it as the main level. Normal F6 shows a moving blue square and time. Use even viewport dimensions, such as 1280 × 720; the teaching clip uses 512 × 288.
RecordingSlate.cs
using Reckfell;
public partial class RecordingSlate : Control
{
private double _time;
private Label _label = null!;
public override void _Ready()
{
SetAnchorsAndOffsetsPreset(LayoutPreset.FullRect);
_label = new Label { Position = new Vector2(16, 12) };
AddChild(_label);
}
public override void _Process(double delta)
{
_time += delta;
_label.Text = $"Reckfell 1.0.0 {_time:0.00} s";
QueueRedraw();
}
public override void _Draw()
{
DrawRect(new Rect2(Vector2.Zero, Size), new Color(.03f, .03f, .04f));
float x = 24 + (float)(_time * 100 % Mathf.Max(1, Size.X - 96));
DrawRect(new Rect2(x, 70, 64, 64), new Color(.15f, .35f, 1));
DrawLine(new Vector2(24, 150), new Vector2(Size.X - 24, 150), Colors.White, 2);
}
}Record four seconds from PowerShell
Set the actual Reckfell console binary in the first line and your project in the second. A new Capture subdirectory separates the run from old frames. The project must contain project.reckfell, have an assigned main level and a completed C# build.
$engine = 'C:/Tools/Reckfell/Reckfell Engine.console.exe'
$project = 'C:/Projects/RecordingDemo'
$output = Join-Path $project ('Capture/' + (Get-Date -Format 'yyyyMMdd-HHmmss'))
New-Item -ItemType Directory -Path $output
& $engine --path $project --write-movie "$output/slate.ogv" --fixed-fps 30 --quit-after 120 --disable-vsyncExpect slate.ogv and a 120 frames at 30 FPS message: four seconds of video. Here --quit-after limits recorded run iterations, not seconds. Without an explicit finish, recording continues until the application closes or calls GetTree().Quit().
Do not add --headless; normal headless uses a dummy renderer and cannot supply these frames. A working graphics driver is required. --disable-vsync can reduce synchronization waits but does not guarantee faster-than-real-time recording. Simulation timing and hardware recording speed are separate.
Choose the output
| Output | Contents and purpose |
|---|---|
.ogv | Theora + Vorbis; compact and playable with built-in VideoStreamPlayer; dimensions must be even |
.png | Lossless PNG sequence plus separate PCM WAV; useful for editing and frame inspection, with greater storage use |
.avi | MJPEG + PCM; large files with 32-bit size fields; check the target player and avoid long high-bitrate captures |
| MP4 / WebM | Separate transcoding or a custom MovieWriter; changing the extension does not create a writer |
For PNG, use the variables above and the same newly created directory:
& $engine --path $project --write-movie "$output/frames.png" --fixed-fps 30 --quit-after 120 --disable-vsyncThis creates frames00000000.png, subsequent numbered frames and frames.wav, not one frames.png. Use the same FPS when assembling them externally. Use a new directory for each new sequence so leftover higher-numbered frames cannot enter an edit.
AVI example:
& $engine --path $project --write-movie "$output/slate.avi" --fixed-fps 30 --quit-after 120 --disable-vsyncOther containers/codecs need a MovieWriter implementation or an external tool such as FFmpeg. Installing it is unnecessary for these three built-in outputs and is not performed by these commands.
Settings and audio
| Project Settings | Purpose |
|---|---|
editor/movie_writer/fps | FPS for ordinary editor Movie Maker runs; CLI --fixed-fps sets the run explicitly |
editor/movie_writer/movie_file | Editor recording path |
editor/movie_writer/video_quality | The writer's compression quality, not scene-rendering quality |
editor/movie_writer/mix_rate | Audio rate; 48000 Hz divides evenly into 30/60 FPS |
editor/movie_writer/ogv/keyframe_interval | OGV keyframe interval, affecting compression and later seeking |
The PNG writer produces 32-bit PCM WAV; AVI bit-depth settings do not change that format. The engine warns when audio rate does not divide evenly by FPS. A clip without active sounds can still contain a quiet audio track.
In the editor, use Open Movie Maker Settings…, choose the file, enable Enable Movie Maker Mode, then run. Disable recording before ordinary interactive testing. End normally so the writer finalizes indices and container sizes; forcibly terminating the process can leave an incomplete file.
Resolution and quality
The recording-start log reports actual width and height. Configure the project viewport before running. If the window and output sizes differ, the current writer can crop to the output aspect and resize; inspect frame edges as well as file dimensions. High graphics quality does not automatically change resolution.
For reproducible footage, use fixed data, random seeds and local resources. Movie Maker does not make network responses or user actions deterministic. Test a short segment with the intended settings before a long render.
Verify the result
Compare logged frame count, FPS and expected duration. Open the beginning and end; check movement, dimensions and audio. Try the ready-made OGV in the built-in VideoDemo. This guide's checks also decode actual PNG/JPEG frames, validate WAV and play OGV; that is not certification of every external player.
If recording never starts, check writer extension, output directory, permissions and free space. For empty frames, check the chosen level, graphics driver and absence of headless. For a short file, inspect gameplay Quit conditions. Do not stop solely by wall-clock duration; expensive frames can take longer to compute.