video
stableRaw video frame buffer plugin for building, manipulating, and exporting RGBA video data. Provides a Video class for frame management alongside free functions for pixel format conversion and BMP parsing.
use plugin video Plugin snippets can be edited in the Playground, but native capabilities are executed locally with the Zolo CLI.
Functions (19)
- Video Creates a new video buffer with the given pixel dimensions.
- add_frame Append an RGBA frame to the video
- set_fps Set the frames-per-second rate
- set_codec Set the codec label string
- set_resolution Change width and height before frames are added
- frame_count Get the number of stored frames
- duration Get video duration in seconds
- get_frame Retrieve a frame by index
- set_metadata Set a metadata key-value pair
- get_metadata Get all metadata as a table
- info Get width, height, fps, codec, and duration
- export Export all frames as a raw ZRAW byte blob
- clear_frames Remove all frames from the buffer
- create_raw_frame Create a solid-color RGBA frame
- rgba_to_rgb Strip alpha channel from RGBA bytes
- rgb_to_rgba Add alpha channel to RGB bytes
- frame_size Compute byte size of a frame
- parse_bmp_header Parse a BMP file header
- flip_vertical Flip an RGBA frame upside-down
From import to result
- 01Import only what you use
- 02Copy the smallest example
- 03Run it with the Zolo CLI
Creates a new video buffer with the given pixel dimensions.
Creates a new video buffer with the given pixel dimensions. Defaults to 30 fps and "raw" codec. All frames added must be width * height * 4 bytes (RGBA).
use plugin video::{Video, create_raw_frame}
let vid = Video(320, 240)
vid.set_fps(24)
let frame = create_raw_frame(320, 240, 0, 128, 255)
vid.add_frame(frame)
print(vid.frame_count())Append an RGBA frame to the video
Appends a raw RGBA frame (exactly width * height * 4 bytes) to the video buffer. Errors if the byte count does not match the video dimensions.
use plugin video::{Video, create_raw_frame}
let vid = Video(160, 120)
let red = create_raw_frame(160, 120, 255, 0, 0)
vid.add_frame(red)Set the frames-per-second rate
Sets the playback frame rate. Must be greater than zero. Affects the value returned by duration.
use plugin video::{Video}
let vid = Video(640, 480)
vid.set_fps(60)Set the codec label string
Sets the codec label string (e.g. "h264", "vp9", "raw"). This is metadata only and does not affect the stored frame bytes.
use plugin video::{Video}
let vid = Video(1920, 1080)
vid.set_codec("h264")Change width and height before frames are added
Changes the video dimensions. Can only be called before any frames have been added — errors otherwise.
use plugin video::{Video}
let vid = Video(100, 100)
vid.set_resolution(1280, 720)Get the number of stored frames
Returns the number of frames currently stored in the buffer.
use plugin video::{Video, create_raw_frame}
let vid = Video(64, 64)
vid.add_frame(create_raw_frame(64, 64, 0, 0, 0))
vid.add_frame(create_raw_frame(64, 64, 255, 255, 255))
print(vid.frame_count())Get video duration in seconds
Returns the total duration in seconds calculated as frame_count / fps.
use plugin video::{Video, create_raw_frame}
let vid = Video(320, 240)
vid.set_fps(25)
vid.add_frame(create_raw_frame(320, 240, 0, 0, 0))
print(vid.duration())Retrieve a frame by index
Returns the raw RGBA bytes for the frame at the given zero-based index. Errors if the index is out of range.
use plugin video::{Video, create_raw_frame}
let vid = Video(2, 2)
vid.add_frame(create_raw_frame(2, 2, 128, 64, 32))
let frame = vid.get_frame(0)
print(frame)Set a metadata key-value pair
Sets a string metadata field on the video. Replaces the value if the key already exists.
use plugin video::{Video}
let vid = Video(1920, 1080)
vid.set_metadata("title", "My Video")
vid.set_metadata("author", "Alice")Get all metadata as a table
Returns all metadata key-value pairs as a table.
use plugin video::{Video}
let vid = Video(640, 480)
vid.set_metadata("title", "Test")
let meta = vid.get_metadata()
print(meta["title"])Get width, height, fps, codec, and duration
Returns a summary table with width, height, fps, codec, frame_count, and duration.
use plugin video::{Video}
let vid = Video(1280, 720)
vid.set_fps(30)
vid.set_codec("vp9")
let i = vid.info()
print("{i["width"]}x{i["height"]} @ {i["fps"]}fps")Export all frames as a raw ZRAW byte blob
Exports all frames as a raw ZRAW container: a 20-byte header ("ZRAW" magic, width, height, fps, frame count) followed by the concatenated RGBA frame bytes.
use plugin video::{Video, create_raw_frame}
let vid = Video(4, 4)
vid.add_frame(create_raw_frame(4, 4, 255, 0, 0))
let raw = vid.export()
print(raw)Remove all frames from the buffer
Removes all frames from the buffer, resetting frame_count to zero while keeping resolution, fps, codec, and metadata intact.
use plugin video::{Video, create_raw_frame}
let vid = Video(64, 64)
vid.add_frame(create_raw_frame(64, 64, 0, 0, 0))
vid.clear_frames()
print(vid.frame_count())Create a solid-color RGBA frame
Creates a solid-color RGBA frame of w * h pixels. Alpha is always 255. Returns a byte blob of size w * h * 4.
use plugin video::{create_raw_frame}
let white = create_raw_frame(320, 240, 255, 255, 255)
let red = create_raw_frame(320, 240, 255, 0, 0)Strip alpha channel from RGBA bytes
Strips the alpha channel from RGBA bytes, returning a 3-bytes-per-pixel RGB blob. The input length must be a multiple of 4.
use plugin video::{create_raw_frame, rgba_to_rgb}
let rgba = create_raw_frame(10, 10, 128, 64, 32)
let rgb = rgba_to_rgb(rgba)Add alpha channel to RGB bytes
Adds a fully opaque alpha channel (255) to each RGB pixel, returning an RGBA blob. The input length must be a multiple of 3.
use plugin video::{rgba_to_rgb, rgb_to_rgba, create_raw_frame}
let rgba = create_raw_frame(8, 8, 0, 200, 100)
let rgb = rgba_to_rgb(rgba)
let back = rgb_to_rgba(rgb)Compute byte size of a frame
Computes w * h * channels. Useful for pre-allocating buffers or validating frame byte lengths.
use plugin video::{frame_size}
print(frame_size(1920, 1080, 4))
print(frame_size(1920, 1080, 3))Parse a BMP file header
Parses the header of a BMP file and returns a table with width, height, bpp (bits per pixel), and data_offset. Requires at least 54 bytes.
use plugin video::{parse_bmp_header}
let info = parse_bmp_header(bmp_bytes)
print("{info["width"]}x{info["height"]} @ {info["bpp"]}bpp")Flip an RGBA frame upside-down
Flips an RGBA frame vertically by swapping rows top-to-bottom. The byte length must equal w * h * 4. Use this when working with BMP images, which are stored bottom-up.
use plugin video::{create_raw_frame, flip_vertical}
let frame = create_raw_frame(320, 240, 0, 128, 255)
let flipped = flip_vertical(frame, 320, 240)