junkpile

22 · Tauri v1 Image Sequence Player

A two-window Tauri v1 example for playing numbered still-image sequences as time-based media. The controls WebView handles folder/file selection and transport; the output WebView owns WebGL rendering, decoding, caching, display placement, and PNG capture.

Run

npm install
npm run dev

First test

  1. Launch the app. A generated 180-frame demo begins immediately.
  2. Use Play/Pause, Reverse, frame stepping, scrubbing, loop modes, and frame blending.
  3. Choose Choose folder to scan a directory of frames, or Choose files to select individual images.
  4. For projector/fullscreen use, select a display and press Move to display, then Fullscreen output.

Supported frame files

Frames are naturally sorted by filename, so frame_2.png appears before frame_10.png even when filenames are not zero-padded.

Architecture

controls window
  ├─ native folder/file dialog
  ├─ Rust directory scanner
  ├─ transport + cache settings
  └─ Tauri event bus
          ↓
output window
  ├─ image decode queue
  ├─ windowed or full cache
  ├─ playback clock + in/out range
  ├─ adjacent-frame blend
  ├─ WebGL framing / grade
  └─ display fullscreen + PNG export

The selected local paths are converted to Tauri asset URLs inside the output WebView. The output keeps at most four image decodes active at once and reports ready/loading/error counts back to the controls window.

Playback modes

Cache modes

Keyboard shortcuts

Important implementation files

src/app.js                 controls, file selection, transport, output commands
src/output.js              decoder cache, playback clock, WebGL renderer
src-tauri/src/main.rs      recursive directory scanner command
src-tauri/tauri.conf.json  two windows, dialogs, asset protocol, output permissions

Notes

Playback stability update

This build waits for the current and next frame before starting a newly loaded file sequence. The default Hold every frame mode pauses the playback clock when decoding falls behind, then resumes from the same playhead instead of skipping into an empty cache.