{"id":13670799,"url":"https://github.com/dmnsgn/canvas-record","last_synced_at":"2025-05-15T07:07:37.935Z","repository":{"id":41070590,"uuid":"192519882","full_name":"dmnsgn/canvas-record","owner":"dmnsgn","description":"Record a video in the browser or directly on the File System from a canvas region (2D/WebGL/WebGPU) as MP4, WebM, MKV, GIF, PNG/JPG Sequence using WebCodecs and Wasm when available.","archived":false,"fork":false,"pushed_at":"2025-05-11T20:38:55.000Z","size":19512,"stargazers_count":360,"open_issues_count":4,"forks_count":20,"subscribers_count":6,"default_branch":"main","last_synced_at":"2025-05-11T20:44:30.787Z","etag":null,"topics":["canvas","capture","download","filesystem","gif","mp4","record","video","webcodecs"],"latest_commit_sha":null,"homepage":"https://dmnsgn.github.io/canvas-record/","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/dmnsgn.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null},"funding":{"custom":["https://paypal.me/dmnsgn","https://commerce.coinbase.com/checkout/56cbdf28-e323-48d8-9c98-7019e72c97f3"]}},"created_at":"2019-06-18T10:39:52.000Z","updated_at":"2025-05-11T20:38:58.000Z","dependencies_parsed_at":"2024-06-19T00:03:44.632Z","dependency_job_id":"62ea9393-2acc-489c-8455-6405aa092eb5","html_url":"https://github.com/dmnsgn/canvas-record","commit_stats":{"total_commits":15,"total_committers":3,"mean_commits":5.0,"dds":0.1333333333333333,"last_synced_commit":"991bad53aba8888a33f1ca5fc429f5c61a37796d"},"previous_names":[],"tags_count":22,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dmnsgn%2Fcanvas-record","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dmnsgn%2Fcanvas-record/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dmnsgn%2Fcanvas-record/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dmnsgn%2Fcanvas-record/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dmnsgn","download_url":"https://codeload.github.com/dmnsgn/canvas-record/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254292043,"owners_count":22046426,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["canvas","capture","download","filesystem","gif","mp4","record","video","webcodecs"],"created_at":"2024-08-02T09:00:49.689Z","updated_at":"2025-05-15T07:07:32.912Z","avatar_url":"https://github.com/dmnsgn.png","language":"JavaScript","readme":"# canvas-record\n\n[![npm version](https://img.shields.io/npm/v/canvas-record)](https://www.npmjs.com/package/canvas-record)\n[![stability-stable](https://img.shields.io/badge/stability-stable-green.svg)](https://www.npmjs.com/package/canvas-record)\n[![npm minzipped size](https://img.shields.io/bundlephobia/minzip/canvas-record)](https://bundlephobia.com/package/canvas-record)\n[![dependencies](https://img.shields.io/librariesio/release/npm/canvas-record)](https://github.com/dmnsgn/canvas-record/blob/main/package.json)\n[![types](https://img.shields.io/npm/types/canvas-record)](https://github.com/microsoft/TypeScript)\n[![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-fa6673.svg)](https://conventionalcommits.org)\n[![styled with prettier](https://img.shields.io/badge/styled_with-Prettier-f8bc45.svg?logo=prettier)](https://github.com/prettier/prettier)\n[![linted with eslint](https://img.shields.io/badge/linted_with-ES_Lint-4B32C3.svg?logo=eslint)](https://github.com/eslint/eslint)\n[![license](https://img.shields.io/github/license/dmnsgn/canvas-record)](https://github.com/dmnsgn/canvas-record/blob/main/LICENSE.md)\n\nRecord a video in the browser or directly on the File System from a canvas (2D/WebGL/WebGPU) as MP4, WebM, MKV, GIF, PNG/JPG Sequence using WebCodecs and Wasm when available.\n\n[![paypal](https://img.shields.io/badge/donate-paypal-informational?logo=paypal)](https://paypal.me/dmnsgn)\n[![coinbase](https://img.shields.io/badge/donate-coinbase-informational?logo=coinbase)](https://commerce.coinbase.com/checkout/56cbdf28-e323-48d8-9c98-7019e72c97f3)\n[![twitter](https://img.shields.io/twitter/follow/dmnsgn?style=social)](https://twitter.com/dmnsgn)\n\n![](https://raw.githubusercontent.com/dmnsgn/canvas-record/main/screenshot.gif)\n\n## Installation\n\n```bash\nnpm install canvas-record\n```\n\n## Usage\n\n```js\nimport { Recorder, RecorderStatus, Encoders } from \"canvas-record\";\nimport createCanvasContext from \"canvas-context\";\nimport { AVC } from \"media-codecs\";\n\n// Setup\nconst pixelRatio = devicePixelRatio;\nconst width = 512;\nconst height = 512;\nconst { context, canvas } = createCanvasContext(\"2d\", {\n  width: width * pixelRatio,\n  height: height * pixelRatio,\n  contextAttributes: { willReadFrequently: true },\n});\nObject.assign(canvas.style, { width: `${width}px`, height: `${height}px` });\n\nconst mainElement = document.querySelector(\"main\");\nmainElement.appendChild(canvas);\n\n// Animation\nlet canvasRecorder;\n\nfunction render() {\n  const width = canvas.width;\n  const height = canvas.height;\n\n  const t = canvasRecorder.frame / canvasRecorder.frameTotal || Number.EPSILON;\n\n  context.clearRect(0, 0, width, height);\n  context.fillStyle = \"red\";\n  context.fillRect(0, 0, t * width, height);\n}\n\nconst tick = async () =\u003e {\n  render();\n\n  if (canvasRecorder.status !== RecorderStatus.Recording) return;\n  await canvasRecorder.step();\n\n  if (canvasRecorder.status !== RecorderStatus.Stopped) {\n    requestAnimationFrame(() =\u003e tick());\n  }\n};\n\ncanvasRecorder = new Recorder(context, {\n  name: \"canvas-record-example\",\n  encoderOptions: {\n    codec: AVC.getCodec({ profile: \"Main\", level: \"5.2\" }),\n  },\n});\n\n// Start and encode frame 0\nawait canvasRecorder.start();\n\n// Animate to encode the rest\ntick(canvasRecorder);\n```\n\n## API\n\nEncoder comparison:\n\n| Encoder        | Extension              | Required Web API   | WASM                  | Speed    |\n| -------------- | ---------------------- | ------------------ | --------------------- | -------- |\n| `WebCodecs`    | `mp4` / `webm` / `mkv` | WebCodecs          | ❌                    | Fast     |\n| `MP4Wasm`      | `mp4`                  | WebCodecs          | ✅ (embed)            | Fast     |\n| `H264MP4`      | `mp4`                  |                    | ✅ (embed)            | Medium   |\n| `FFmpeg`       | `mp4` / `webm`         | SharedArrayBuffer  | ✅ (need binary path) | Slow     |\n| `GIF`          | `gif`                  | WebWorkers (wip)   | ❌                    | Fast     |\n| `Frame`        | `png` / `jpg`          | File System Access | ❌                    | Fast     |\n| `MediaCapture` | `mkv` / `webm`         | MediaStream        | ❌                    | Realtime |\n\nNote:\n\n- `WebCodecs` encoderOptions allow different codecs to be used: VP8/VP9/AV1/HEVC. See [media-codecs](https://github.com/dmnsgn/media-codecs) to get a codec string from human readable options and check which ones are supported in your browser with [github.io/media-codecs](https://dmnsgn.github.io/media-codecs/).\n- `WebCodecs` 5-10x faster than H264MP4Encoder and 20x faster than `FFmpeg` (it needs to mux files after writing png to virtual FS)\n- `FFmpeg` (mp4 and webm) and `WebCodecs` (mp4) have a AVC maximum frame size of 9437184 pixels. That's fine until a bit more than 4K 16:9 @ 30fps. So if you need 4K Square or 8K exports, be patient with `H264MP4Encoder` (which probably also has the 4GB memory limit) or use Frame encoder and mux them manually with `FFmpeg` CLI (`ffmpeg -framerate 30 -i \"%05d.jpg\" -b:v 60M -r 30 -profile:v baseline -pix_fmt yuv420p -movflags +faststart output.mp4`)\n- `MP4Wasm` is embedded from [mp4-wasm](https://github.com/mattdesl/mp4-wasm/) for ease of use (`FFmpeg` will require `encoderOptions.corePath`)\n\nRoadmap:\n\n- [ ] add debug logging\n- [ ] use WebWorkers for gifenc\n\n\u003c!-- api-start --\u003e\n\n## Modules\n\n\u003cdl\u003e\n\u003cdt\u003e\u003ca href=\"#module_canvas-record\"\u003ecanvas-record\u003c/a\u003e\u003c/dt\u003e\n\u003cdd\u003e\u003cp\u003eRe-export Recorder, RecorderStatus, all Encoders and utils.\u003c/p\u003e\n\u003c/dd\u003e\n\u003c/dl\u003e\n\n## Classes\n\n\u003cdl\u003e\n\u003cdt\u003e\u003ca href=\"#Encoder\"\u003eEncoder\u003c/a\u003e\u003c/dt\u003e\n\u003cdd\u003e\u003c/dd\u003e\n\u003cdt\u003e\u003ca href=\"#FFmpegEncoder\"\u003eFFmpegEncoder\u003c/a\u003e\u003c/dt\u003e\n\u003cdd\u003e\u003c/dd\u003e\n\u003cdt\u003e\u003ca href=\"#FrameEncoder\"\u003eFrameEncoder\u003c/a\u003e\u003c/dt\u003e\n\u003cdd\u003e\u003c/dd\u003e\n\u003cdt\u003e\u003ca href=\"#GIFEncoder\"\u003eGIFEncoder\u003c/a\u003e\u003c/dt\u003e\n\u003cdd\u003e\u003c/dd\u003e\n\u003cdt\u003e\u003ca href=\"#H264MP4Encoder\"\u003eH264MP4Encoder\u003c/a\u003e\u003c/dt\u003e\n\u003cdd\u003e\u003c/dd\u003e\n\u003cdt\u003e\u003ca href=\"#MediaCaptureEncoder\"\u003eMediaCaptureEncoder\u003c/a\u003e\u003c/dt\u003e\n\u003cdd\u003e\u003c/dd\u003e\n\u003cdt\u003e\u003ca href=\"#MP4WasmEncoder\"\u003eMP4WasmEncoder\u003c/a\u003e\u003c/dt\u003e\n\u003cdd\u003e\u003c/dd\u003e\n\u003cdt\u003e\u003ca href=\"#WebCodecsEncoder\"\u003eWebCodecsEncoder\u003c/a\u003e\u003c/dt\u003e\n\u003cdd\u003e\u003c/dd\u003e\n\u003cdt\u003e\u003ca href=\"#Recorder\"\u003eRecorder\u003c/a\u003e\u003c/dt\u003e\n\u003cdd\u003e\u003c/dd\u003e\n\u003c/dl\u003e\n\n## Constants\n\n\u003cdl\u003e\n\u003cdt\u003e\u003ca href=\"#isWebCodecsSupported\"\u003eisWebCodecsSupported\u003c/a\u003e : \u003ccode\u003eboolean\u003c/code\u003e\u003c/dt\u003e\n\u003cdd\u003e\u003cp\u003eCheck for WebCodecs support on the current platform.\u003c/p\u003e\n\u003c/dd\u003e\n\u003c/dl\u003e\n\n## Functions\n\n\u003cdl\u003e\n\u003cdt\u003e\u003ca href=\"#estimateBitRate\"\u003eestimateBitRate(width, height, frameRate, motionRank, bitrateMode)\u003c/a\u003e ⇒ \u003ccode\u003enumber\u003c/code\u003e\u003c/dt\u003e\n\u003cdd\u003e\u003cp\u003eEstimate the bit rate of a video rounded to nearest megabit.\nBased on \u0026quot;H.264 for the rest of us\u0026quot; by Kush Amerasinghe.\u003c/p\u003e\n\u003c/dd\u003e\n\u003c/dl\u003e\n\n## Typedefs\n\n\u003cdl\u003e\n\u003cdt\u003e\u003ca href=\"#EncoderExtensions\"\u003eEncoderExtensions\u003c/a\u003e : \u003ccode\u003e\u0026quot;mp4\u0026quot;\u003c/code\u003e | \u003ccode\u003e\u0026quot;webm\u0026quot;\u003c/code\u003e | \u003ccode\u003e\u0026quot;png\u0026quot;\u003c/code\u003e | \u003ccode\u003e\u0026quot;jpg\u0026quot;\u003c/code\u003e | \u003ccode\u003e\u0026quot;gif\u0026quot;\u003c/code\u003e | \u003ccode\u003e\u0026quot;mkv\u0026quot;\u003c/code\u003e\u003c/dt\u003e\n\u003cdd\u003e\u003c/dd\u003e\n\u003cdt\u003e\u003ca href=\"#EncoderTarget\"\u003eEncoderTarget\u003c/a\u003e : \u003ccode\u003e\u0026quot;in-browser\u0026quot;\u003c/code\u003e | \u003ccode\u003e\u0026quot;file-system\u0026quot;\u003c/code\u003e\u003c/dt\u003e\n\u003cdd\u003e\u003c/dd\u003e\n\u003cdt\u003e\u003ca href=\"#FFmpegEncoderOptions\"\u003eFFmpegEncoderOptions\u003c/a\u003e : \u003ccode\u003eobject\u003c/code\u003e\u003c/dt\u003e\n\u003cdd\u003e\u003c/dd\u003e\n\u003cdt\u003e\u003ca href=\"#FFmpegEncoderEncoderOptions\"\u003eFFmpegEncoderEncoderOptions\u003c/a\u003e : \u003ccode\u003emodule:@ffmpeg/ffmpeg/dist/esm/types.js~FFMessageLoadConfig\u003c/code\u003e\u003c/dt\u003e\n\u003cdd\u003e\u003c/dd\u003e\n\u003cdt\u003e\u003ca href=\"#GIFEncoderOptions\"\u003eGIFEncoderOptions\u003c/a\u003e : \u003ccode\u003eobject\u003c/code\u003e\u003c/dt\u003e\n\u003cdd\u003e\u003c/dd\u003e\n\u003cdt\u003e\u003ca href=\"#GIFEncoderQuantizeOptions\"\u003eGIFEncoderQuantizeOptions\u003c/a\u003e : \u003ccode\u003eobject\u003c/code\u003e\u003c/dt\u003e\n\u003cdd\u003e\u003c/dd\u003e\n\u003cdt\u003e\u003ca href=\"#GIFEncoderEncoderOptions\"\u003eGIFEncoderEncoderOptions\u003c/a\u003e : \u003ccode\u003eobject\u003c/code\u003e\u003c/dt\u003e\n\u003cdd\u003e\u003c/dd\u003e\n\u003cdt\u003e\u003ca href=\"#H264MP4EncoderOptions\"\u003eH264MP4EncoderOptions\u003c/a\u003e : \u003ccode\u003eobject\u003c/code\u003e\u003c/dt\u003e\n\u003cdd\u003e\u003c/dd\u003e\n\u003cdt\u003e\u003ca href=\"#H264MP4EncoderEncoderOptions\"\u003eH264MP4EncoderEncoderOptions\u003c/a\u003e : \u003ccode\u003emodule:h264-mp4-encoder~H264MP4Encoder\u003c/code\u003e\u003c/dt\u003e\n\u003cdd\u003e\u003c/dd\u003e\n\u003cdt\u003e\u003ca href=\"#MediaCaptureEncoderOptions\"\u003eMediaCaptureEncoderOptions\u003c/a\u003e : \u003ccode\u003eobject\u003c/code\u003e\u003c/dt\u003e\n\u003cdd\u003e\u003c/dd\u003e\n\u003cdt\u003e\u003ca href=\"#MediaCaptureEncoderEncoderOptions\"\u003eMediaCaptureEncoderEncoderOptions\u003c/a\u003e : \u003ccode\u003eMediaRecorderOptions\u003c/code\u003e\u003c/dt\u003e\n\u003cdd\u003e\u003c/dd\u003e\n\u003cdt\u003e\u003ca href=\"#MP4WasmEncoderOptions\"\u003eMP4WasmEncoderOptions\u003c/a\u003e : \u003ccode\u003eobject\u003c/code\u003e\u003c/dt\u003e\n\u003cdd\u003e\u003c/dd\u003e\n\u003cdt\u003e\u003ca href=\"#MP4WasmEncoderEncoderOptions\"\u003eMP4WasmEncoderEncoderOptions\u003c/a\u003e : \u003ccode\u003eVideoEncoderConfig\u003c/code\u003e\u003c/dt\u003e\n\u003cdd\u003e\u003c/dd\u003e\n\u003cdt\u003e\u003ca href=\"#WebCodecsEncoderOptions\"\u003eWebCodecsEncoderOptions\u003c/a\u003e : \u003ccode\u003eobject\u003c/code\u003e\u003c/dt\u003e\n\u003cdd\u003e\u003c/dd\u003e\n\u003cdt\u003e\u003ca href=\"#WebCodecsEncoderEncoderOptions\"\u003eWebCodecsEncoderEncoderOptions\u003c/a\u003e : \u003ccode\u003eVideoEncoderConfig\u003c/code\u003e\u003c/dt\u003e\n\u003cdd\u003e\u003c/dd\u003e\n\u003cdt\u003e\u003ca href=\"#WebCodecsMuxerOptions\"\u003eWebCodecsMuxerOptions\u003c/a\u003e : \u003ccode\u003eMuxerOptions\u003c/code\u003e\u003c/dt\u003e\n\u003cdd\u003e\u003c/dd\u003e\n\u003cdt\u003e\u003ca href=\"#onStatusChangeCb\"\u003eonStatusChangeCb\u003c/a\u003e : \u003ccode\u003efunction\u003c/code\u003e\u003c/dt\u003e\n\u003cdd\u003e\u003cp\u003eA callback to notify on the status change. To compare with RecorderStatus enum values.\u003c/p\u003e\n\u003c/dd\u003e\n\u003cdt\u003e\u003ca href=\"#RecorderOptions\"\u003eRecorderOptions\u003c/a\u003e : \u003ccode\u003eobject\u003c/code\u003e\u003c/dt\u003e\n\u003cdd\u003e\u003cp\u003eOptions for recording. All optional.\u003c/p\u003e\n\u003c/dd\u003e\n\u003cdt\u003e\u003ca href=\"#RecorderStartOptions\"\u003eRecorderStartOptions\u003c/a\u003e : \u003ccode\u003eobject\u003c/code\u003e\u003c/dt\u003e\n\u003cdd\u003e\u003cp\u003eOptions for recording initialisation. All optional.\u003c/p\u003e\n\u003c/dd\u003e\n\u003c/dl\u003e\n\n\u003ca name=\"module_canvas-record\"\u003e\u003c/a\u003e\n\n## canvas-record\n\nRe-export Recorder, RecorderStatus, all Encoders and utils.\n\n\u003ca name=\"Encoder\"\u003e\u003c/a\u003e\n\n## Encoder\n\n**Kind**: global class\n**Properties**\n\n| Name             | Type                                                 |\n| ---------------- | ---------------------------------------------------- |\n| target           | [\u003ccode\u003eEncoderTarget\u003c/code\u003e](#EncoderTarget)         |\n| extension        | [\u003ccode\u003eEncoderExtensions\u003c/code\u003e](#EncoderExtensions) |\n| [encoderOptions] | \u003ccode\u003eobject\u003c/code\u003e                                  |\n| [muxerOptions]   | \u003ccode\u003eobject\u003c/code\u003e                                  |\n\n- [Encoder](#Encoder)\n  - [new Encoder(options)](#new_Encoder_new)\n  - [.supportedExtensions](#Encoder+supportedExtensions) : \u003ccode\u003eArray.\u0026lt;Extensions\u0026gt;\u003c/code\u003e\n  - [.supportedTargets](#Encoder+supportedTargets) : [\u003ccode\u003eArray.\u0026lt;EncoderTarget\u0026gt;\u003c/code\u003e](#EncoderTarget)\n  - [.init(options)](#Encoder+init)\n  - [.encode(frame, [frameNumber])](#Encoder+encode)\n  - [.stop()](#Encoder+stop) ⇒ \u003ccode\u003eArrayBuffer\u003c/code\u003e \\| \u003ccode\u003eUint8Array\u003c/code\u003e \\| \u003ccode\u003eArray.\u0026lt;Blob\u0026gt;\u003c/code\u003e \\| \u003ccode\u003eundefined\u003c/code\u003e\n  - [.dispose()](#Encoder+dispose)\n\n\u003ca name=\"new_Encoder_new\"\u003e\u003c/a\u003e\n\n### new Encoder(options)\n\nBase Encoder class. All Encoders extend it and its method are called by the Recorder.\n\n| Param   | Type                |\n| ------- | ------------------- |\n| options | \u003ccode\u003eobject\u003c/code\u003e |\n\n\u003ca name=\"Encoder+supportedExtensions\"\u003e\u003c/a\u003e\n\n### encoder.supportedExtensions : \u003ccode\u003eArray.\u0026lt;Extensions\u0026gt;\u003c/code\u003e\n\nThe extension the encoder supports\n\n**Kind**: instance property of [\u003ccode\u003eEncoder\u003c/code\u003e](#Encoder)\n\u003ca name=\"Encoder+supportedTargets\"\u003e\u003c/a\u003e\n\n### encoder.supportedTargets : [\u003ccode\u003eArray.\u0026lt;EncoderTarget\u0026gt;\u003c/code\u003e](#EncoderTarget)\n\nThe target to download the file to.\n\n**Kind**: instance property of [\u003ccode\u003eEncoder\u003c/code\u003e](#Encoder)\n\u003ca name=\"Encoder+init\"\u003e\u003c/a\u003e\n\n### encoder.init(options)\n\nSetup the encoder: load binary, instantiate muxers, setup file system target...\n\n**Kind**: instance method of [\u003ccode\u003eEncoder\u003c/code\u003e](#Encoder)\n\n| Param   | Type                |\n| ------- | ------------------- |\n| options | \u003ccode\u003eobject\u003c/code\u003e |\n\n\u003ca name=\"Encoder+encode\"\u003e\u003c/a\u003e\n\n### encoder.encode(frame, [frameNumber])\n\nEncode a single frame. The frameNumber is usually used for GOP (Group Of Pictures).\n\n**Kind**: instance method of [\u003ccode\u003eEncoder\u003c/code\u003e](#Encoder)\n\n| Param         | Type                |\n| ------------- | ------------------- |\n| frame         | \u003ccode\u003enumber\u003c/code\u003e |\n| [frameNumber] | \u003ccode\u003enumber\u003c/code\u003e |\n\n\u003ca name=\"Encoder+stop\"\u003e\u003c/a\u003e\n\n### encoder.stop() ⇒ \u003ccode\u003eArrayBuffer\u003c/code\u003e \\| \u003ccode\u003eUint8Array\u003c/code\u003e \\| \u003ccode\u003eArray.\u0026lt;Blob\u0026gt;\u003c/code\u003e \\| \u003ccode\u003eundefined\u003c/code\u003e\n\nStop the encoding process and cleanup the temporary data.\n\n**Kind**: instance method of [\u003ccode\u003eEncoder\u003c/code\u003e](#Encoder)\n\u003ca name=\"Encoder+dispose\"\u003e\u003c/a\u003e\n\n### encoder.dispose()\n\nClean up the encoder\n\n**Kind**: instance method of [\u003ccode\u003eEncoder\u003c/code\u003e](#Encoder)\n\u003ca name=\"FFmpegEncoder\"\u003e\u003c/a\u003e\n\n## FFmpegEncoder\n\n**Kind**: global class\n\u003ca name=\"new_FFmpegEncoder_new\"\u003e\u003c/a\u003e\n\n### new FFmpegEncoder([options])\n\n| Param     | Type                                                       |\n| --------- | ---------------------------------------------------------- |\n| [options] | [\u003ccode\u003eFFmpegEncoderOptions\u003c/code\u003e](#FFmpegEncoderOptions) |\n\n\u003ca name=\"FrameEncoder\"\u003e\u003c/a\u003e\n\n## FrameEncoder\n\n**Kind**: global class\n\u003ca name=\"GIFEncoder\"\u003e\u003c/a\u003e\n\n## GIFEncoder\n\n**Kind**: global class\n\u003ca name=\"new_GIFEncoder_new\"\u003e\u003c/a\u003e\n\n### new GIFEncoder([options])\n\n| Param     | Type                                                 |\n| --------- | ---------------------------------------------------- |\n| [options] | [\u003ccode\u003eGIFEncoderOptions\u003c/code\u003e](#GIFEncoderOptions) |\n\n\u003ca name=\"H264MP4Encoder\"\u003e\u003c/a\u003e\n\n## H264MP4Encoder\n\n**Kind**: global class\n\u003ca name=\"new_H264MP4Encoder_new\"\u003e\u003c/a\u003e\n\n### new H264MP4Encoder([options])\n\n| Param     | Type                                                         |\n| --------- | ------------------------------------------------------------ |\n| [options] | [\u003ccode\u003eH264MP4EncoderOptions\u003c/code\u003e](#H264MP4EncoderOptions) |\n\n\u003ca name=\"MediaCaptureEncoder\"\u003e\u003c/a\u003e\n\n## MediaCaptureEncoder\n\n**Kind**: global class\n\u003ca name=\"new_MediaCaptureEncoder_new\"\u003e\u003c/a\u003e\n\n### new MediaCaptureEncoder([options])\n\n| Param     | Type                                                                   |\n| --------- | ---------------------------------------------------------------------- |\n| [options] | [\u003ccode\u003eMediaCaptureEncoderOptions\u003c/code\u003e](#MediaCaptureEncoderOptions) |\n\n\u003ca name=\"MP4WasmEncoder\"\u003e\u003c/a\u003e\n\n## MP4WasmEncoder\n\n**Kind**: global class\n\u003ca name=\"new_MP4WasmEncoder_new\"\u003e\u003c/a\u003e\n\n### new MP4WasmEncoder([options])\n\n| Param     | Type                                                         |\n| --------- | ------------------------------------------------------------ |\n| [options] | [\u003ccode\u003eMP4WasmEncoderOptions\u003c/code\u003e](#MP4WasmEncoderOptions) |\n\n\u003ca name=\"WebCodecsEncoder\"\u003e\u003c/a\u003e\n\n## WebCodecsEncoder\n\n**Kind**: global class\n\u003ca name=\"new_WebCodecsEncoder_new\"\u003e\u003c/a\u003e\n\n### new WebCodecsEncoder([options])\n\n| Param     | Type                                                             |\n| --------- | ---------------------------------------------------------------- |\n| [options] | [\u003ccode\u003eWebCodecsEncoderOptions\u003c/code\u003e](#WebCodecsEncoderOptions) |\n\n\u003ca name=\"Recorder\"\u003e\u003c/a\u003e\n\n## Recorder\n\n**Kind**: global class\n\n- [Recorder](#Recorder)\n  - [new Recorder(context, [options])](#new_Recorder_new)\n  - [.defaultOptions](#Recorder+defaultOptions) : [\u003ccode\u003eRecorderOptions\u003c/code\u003e](#RecorderOptions)\n  - [.mimeTypes](#Recorder+mimeTypes) : \u003ccode\u003eobject\u003c/code\u003e\n  - [.start([startOptions])](#Recorder+start)\n  - [.step()](#Recorder+step)\n  - [.stop()](#Recorder+stop) ⇒ \u003ccode\u003eArrayBuffer\u003c/code\u003e \\| \u003ccode\u003eUint8Array\u003c/code\u003e \\| \u003ccode\u003eArray.\u0026lt;Blob\u0026gt;\u003c/code\u003e \\| \u003ccode\u003eundefined\u003c/code\u003e\n  - [.dispose()](#Recorder+dispose)\n\n\u003ca name=\"new_Recorder_new\"\u003e\u003c/a\u003e\n\n### new Recorder(context, [options])\n\nCreate a Recorder instance\n\n| Param     | Type                                             | Default         |\n| --------- | ------------------------------------------------ | --------------- |\n| context   | \u003ccode\u003eRenderingContext\u003c/code\u003e                    |                 |\n| [options] | [\u003ccode\u003eRecorderOptions\u003c/code\u003e](#RecorderOptions) | \u003ccode\u003e{}\u003c/code\u003e |\n\n\u003ca name=\"Recorder+defaultOptions\"\u003e\u003c/a\u003e\n\n### recorder.defaultOptions : [\u003ccode\u003eRecorderOptions\u003c/code\u003e](#RecorderOptions)\n\nSensible defaults for recording so that the recorder \"just works\".\n\n**Kind**: instance property of [\u003ccode\u003eRecorder\u003c/code\u003e](#Recorder)\n\u003ca name=\"Recorder+mimeTypes\"\u003e\u003c/a\u003e\n\n### recorder.mimeTypes : \u003ccode\u003eobject\u003c/code\u003e\n\nA mapping of extension to their mime types\n\n**Kind**: instance property of [\u003ccode\u003eRecorder\u003c/code\u003e](#Recorder)\n\u003ca name=\"Recorder+start\"\u003e\u003c/a\u003e\n\n### recorder.start([startOptions])\n\nStart the recording by initializing and optionally calling the initial step.\n\n**Kind**: instance method of [\u003ccode\u003eRecorder\u003c/code\u003e](#Recorder)\n\n| Param          | Type                                                       | Default         |\n| -------------- | ---------------------------------------------------------- | --------------- |\n| [startOptions] | [\u003ccode\u003eRecorderStartOptions\u003c/code\u003e](#RecorderStartOptions) | \u003ccode\u003e{}\u003c/code\u003e |\n\n\u003ca name=\"Recorder+step\"\u003e\u003c/a\u003e\n\n### recorder.step()\n\nEncode a frame and increment the time and the playhead.\nCalls `await canvasRecorder.stop()` when duration is reached.\n\n**Kind**: instance method of [\u003ccode\u003eRecorder\u003c/code\u003e](#Recorder)\n\u003ca name=\"Recorder+stop\"\u003e\u003c/a\u003e\n\n### recorder.stop() ⇒ \u003ccode\u003eArrayBuffer\u003c/code\u003e \\| \u003ccode\u003eUint8Array\u003c/code\u003e \\| \u003ccode\u003eArray.\u0026lt;Blob\u0026gt;\u003c/code\u003e \\| \u003ccode\u003eundefined\u003c/code\u003e\n\nStop the recording and return the recorded buffer.\nIf options.download is set, automatically start downloading the resulting file.\nIs called when duration is reached or manually.\n\n**Kind**: instance method of [\u003ccode\u003eRecorder\u003c/code\u003e](#Recorder)\n\u003ca name=\"Recorder+dispose\"\u003e\u003c/a\u003e\n\n### recorder.dispose()\n\nClean up the recorder and encoder\n\n**Kind**: instance method of [\u003ccode\u003eRecorder\u003c/code\u003e](#Recorder)\n\u003ca name=\"RecorderStatus\"\u003e\u003c/a\u003e\n\n## RecorderStatus : \u003ccode\u003eenum\u003c/code\u003e\n\nEnum for recorder status\n\n**Kind**: global enum\n**Read only**: true\n**Example**\n\n```js\n// Check recorder status before continuing\nif (canvasRecorder.status !== RecorderStatus.Stopped) {\n  rAFId = requestAnimationFrame(() =\u003e tick());\n}\n```\n\n\u003ca name=\"isWebCodecsSupported\"\u003e\u003c/a\u003e\n\n## isWebCodecsSupported : \u003ccode\u003eboolean\u003c/code\u003e\n\nCheck for WebCodecs support on the current platform.\n\n**Kind**: global constant\n\u003ca name=\"estimateBitRate\"\u003e\u003c/a\u003e\n\n## estimateBitRate(width, height, frameRate, motionRank, bitrateMode) ⇒ \u003ccode\u003enumber\u003c/code\u003e\n\nEstimate the bit rate of a video rounded to nearest megabit.\nBased on \"H.264 for the rest of us\" by Kush Amerasinghe.\n\n**Kind**: global function\n**Returns**: \u003ccode\u003enumber\u003c/code\u003e - A bitrate value in bits per second\n\n| Param       | Type                                                                   | Default               | Description           |\n| ----------- | ---------------------------------------------------------------------- | --------------------- | --------------------- |\n| width       | \u003ccode\u003enumber\u003c/code\u003e                                                    |                       |                       |\n| height      | \u003ccode\u003enumber\u003c/code\u003e                                                    |                       |                       |\n| frameRate   | \u003ccode\u003enumber\u003c/code\u003e                                                    | \u003ccode\u003e30\u003c/code\u003e       |                       |\n| motionRank  | \u003ccode\u003enumber\u003c/code\u003e                                                    | \u003ccode\u003e4\u003c/code\u003e        | A factor of 1, 2 or 4 |\n| bitrateMode | \u003ccode\u003e\u0026quot;variable\u0026quot;\u003c/code\u003e \\| \u003ccode\u003e\u0026quot;constant\u0026quot;\u003c/code\u003e | \u003ccode\u003evariable\u003c/code\u003e |                       |\n\n**Example**\n\n```js\n// Full HD (1080p)\nconst bitRate = estimateBitRate(1920, 1080, 30, \"variable\");\nconst bitRateMbps = bitRate * 1_000_000; // =\u003e 13 Mbps\n```\n\n\u003ca name=\"EncoderExtensions\"\u003e\u003c/a\u003e\n\n## EncoderExtensions : \u003ccode\u003e\u0026quot;mp4\u0026quot;\u003c/code\u003e \\| \u003ccode\u003e\u0026quot;webm\u0026quot;\u003c/code\u003e \\| \u003ccode\u003e\u0026quot;png\u0026quot;\u003c/code\u003e \\| \u003ccode\u003e\u0026quot;jpg\u0026quot;\u003c/code\u003e \\| \u003ccode\u003e\u0026quot;gif\u0026quot;\u003c/code\u003e \\| \u003ccode\u003e\u0026quot;mkv\u0026quot;\u003c/code\u003e\n\n**Kind**: global typedef\n\u003ca name=\"EncoderTarget\"\u003e\u003c/a\u003e\n\n## EncoderTarget : \u003ccode\u003e\u0026quot;in-browser\u0026quot;\u003c/code\u003e \\| \u003ccode\u003e\u0026quot;file-system\u0026quot;\u003c/code\u003e\n\n**Kind**: global typedef\n\u003ca name=\"FFmpegEncoderOptions\"\u003e\u003c/a\u003e\n\n## FFmpegEncoderOptions : \u003ccode\u003eobject\u003c/code\u003e\n\n**Kind**: global typedef\n**Properties**\n\n| Name             | Type                                                                     | Default         |\n| ---------------- | ------------------------------------------------------------------------ | --------------- |\n| [encoderOptions] | [\u003ccode\u003eFFmpegEncoderEncoderOptions\u003c/code\u003e](#FFmpegEncoderEncoderOptions) | \u003ccode\u003e{}\u003c/code\u003e |\n\n\u003ca name=\"FFmpegEncoderEncoderOptions\"\u003e\u003c/a\u003e\n\n## FFmpegEncoderEncoderOptions : \u003ccode\u003emodule:@ffmpeg/ffmpeg/dist/esm/types.js~FFMessageLoadConfig\u003c/code\u003e\n\n**Kind**: global typedef\n**See**: [FFmpeg#load](https://ffmpegwasm.netlify.app/docs/api/ffmpeg/classes/FFmpeg#load)\n\u003ca name=\"GIFEncoderOptions\"\u003e\u003c/a\u003e\n\n## GIFEncoderOptions : \u003ccode\u003eobject\u003c/code\u003e\n\n**Kind**: global typedef\n**Properties**\n\n| Name              | Type                                                                 | Default          |\n| ----------------- | -------------------------------------------------------------------- | ---------------- |\n| [maxColors]       | \u003ccode\u003enumber\u003c/code\u003e                                                  | \u003ccode\u003e256\u003c/code\u003e |\n| [quantizeOptions] | [\u003ccode\u003eGIFEncoderQuantizeOptions\u003c/code\u003e](#GIFEncoderQuantizeOptions) |                  |\n| [encoderOptions]  | [\u003ccode\u003eGIFEncoderEncoderOptions\u003c/code\u003e](#GIFEncoderEncoderOptions)   | \u003ccode\u003e{}\u003c/code\u003e  |\n\n\u003ca name=\"GIFEncoderQuantizeOptions\"\u003e\u003c/a\u003e\n\n## GIFEncoderQuantizeOptions : \u003ccode\u003eobject\u003c/code\u003e\n\n**Kind**: global typedef\n**See**: [QuantizeOptions](https://github.com/mattdesl/gifenc#palette--quantizergba-maxcolors-options--)\n**Properties**\n\n| Name                  | Type                                                                                                    | Default                         |\n| --------------------- | ------------------------------------------------------------------------------------------------------- | ------------------------------- |\n| [format]              | \u003ccode\u003e\u0026quot;rgb565\u0026quot;\u003c/code\u003e \\| \u003ccode\u003e\u0026quot;rgb444\u0026quot;\u003c/code\u003e \\| \u003ccode\u003e\u0026quot;rgba4444\u0026quot;\u003c/code\u003e | \u003ccode\u003e\u0026quot;rgb565\u0026quot;\u003c/code\u003e |\n| [oneBitAlpha]         | \u003ccode\u003eboolean\u003c/code\u003e \\| \u003ccode\u003enumber\u003c/code\u003e                                                             | \u003ccode\u003efalse\u003c/code\u003e              |\n| [clearAlpha]          | \u003ccode\u003eboolean\u003c/code\u003e                                                                                    | \u003ccode\u003etrue\u003c/code\u003e               |\n| [clearAlphaThreshold] | \u003ccode\u003enumber\u003c/code\u003e                                                                                     | \u003ccode\u003e0\u003c/code\u003e                  |\n| [clearAlphaColor]     | \u003ccode\u003enumber\u003c/code\u003e                                                                                     | \u003ccode\u003e0x00\u003c/code\u003e               |\n\n\u003ca name=\"GIFEncoderEncoderOptions\"\u003e\u003c/a\u003e\n\n## GIFEncoderEncoderOptions : \u003ccode\u003eobject\u003c/code\u003e\n\n**Kind**: global typedef\n**See**: [WriteFrameOpts](https://github.com/mattdesl/gifenc#gifwriteframeindex-width-height-opts--)\n**Properties**\n\n| Name               | Type                                            | Default            |\n| ------------------ | ----------------------------------------------- | ------------------ |\n| [palette]          | \u003ccode\u003eArray.\u0026lt;Array.\u0026lt;number\u0026gt;\u0026gt;\u003c/code\u003e |                    |\n| [first]            | \u003ccode\u003eboolean\u003c/code\u003e                            | \u003ccode\u003efalse\u003c/code\u003e |\n| [transparent]      | \u003ccode\u003eboolean\u003c/code\u003e                            | \u003ccode\u003e0\u003c/code\u003e     |\n| [transparentIndex] | \u003ccode\u003enumber\u003c/code\u003e                             | \u003ccode\u003e0\u003c/code\u003e     |\n| [delay]            | \u003ccode\u003enumber\u003c/code\u003e                             | \u003ccode\u003e0\u003c/code\u003e     |\n| [repeat]           | \u003ccode\u003enumber\u003c/code\u003e                             | \u003ccode\u003e0\u003c/code\u003e     |\n| [dispose]          | \u003ccode\u003enumber\u003c/code\u003e                             | \u003ccode\u003e-1\u003c/code\u003e    |\n\n\u003ca name=\"H264MP4EncoderOptions\"\u003e\u003c/a\u003e\n\n## H264MP4EncoderOptions : \u003ccode\u003eobject\u003c/code\u003e\n\n**Kind**: global typedef\n**Properties**\n\n| Name             | Type                                                                       | Default         |\n| ---------------- | -------------------------------------------------------------------------- | --------------- |\n| [debug]          | \u003ccode\u003eboolean\u003c/code\u003e                                                       |                 |\n| [encoderOptions] | [\u003ccode\u003eH264MP4EncoderEncoderOptions\u003c/code\u003e](#H264MP4EncoderEncoderOptions) | \u003ccode\u003e{}\u003c/code\u003e |\n\n\u003ca name=\"H264MP4EncoderEncoderOptions\"\u003e\u003c/a\u003e\n\n## H264MP4EncoderEncoderOptions : \u003ccode\u003emodule:h264-mp4-encoder~H264MP4Encoder\u003c/code\u003e\n\n**Kind**: global typedef\n**See**: [h264-mp4-encoder#api](https://github.com/TrevorSundberg/h264-mp4-encoder#api)\n\u003ca name=\"MediaCaptureEncoderOptions\"\u003e\u003c/a\u003e\n\n## MediaCaptureEncoderOptions : \u003ccode\u003eobject\u003c/code\u003e\n\n**Kind**: global typedef\n**Properties**\n\n| Name             | Type                                                                                 | Default         |\n| ---------------- | ------------------------------------------------------------------------------------ | --------------- |\n| [flushFrequency] | \u003ccode\u003enumber\u003c/code\u003e                                                                  | \u003ccode\u003e10\u003c/code\u003e |\n| [encoderOptions] | [\u003ccode\u003eMediaCaptureEncoderEncoderOptions\u003c/code\u003e](#MediaCaptureEncoderEncoderOptions) | \u003ccode\u003e{}\u003c/code\u003e |\n\n\u003ca name=\"MediaCaptureEncoderEncoderOptions\"\u003e\u003c/a\u003e\n\n## MediaCaptureEncoderEncoderOptions : \u003ccode\u003eMediaRecorderOptions\u003c/code\u003e\n\n**Kind**: global typedef\n**See**: [MediaRecorder#options](https://developer.mozilla.org/en-US/docs/Web/API/MediaRecorder/MediaRecorder#options)\n\u003ca name=\"MP4WasmEncoderOptions\"\u003e\u003c/a\u003e\n\n## MP4WasmEncoderOptions : \u003ccode\u003eobject\u003c/code\u003e\n\n**Kind**: global typedef\n**Properties**\n\n| Name              | Type                                                                       | Default         |\n| ----------------- | -------------------------------------------------------------------------- | --------------- |\n| [groupOfPictures] | \u003ccode\u003enumber\u003c/code\u003e                                                        | \u003ccode\u003e20\u003c/code\u003e |\n| [flushFrequency]  | \u003ccode\u003enumber\u003c/code\u003e                                                        | \u003ccode\u003e10\u003c/code\u003e |\n| [encoderOptions]  | [\u003ccode\u003eMP4WasmEncoderEncoderOptions\u003c/code\u003e](#MP4WasmEncoderEncoderOptions) | \u003ccode\u003e{}\u003c/code\u003e |\n\n\u003ca name=\"MP4WasmEncoderEncoderOptions\"\u003e\u003c/a\u003e\n\n## MP4WasmEncoderEncoderOptions : \u003ccode\u003eVideoEncoderConfig\u003c/code\u003e\n\n**Kind**: global typedef\n**See**: [VideoEncoder.configure](https://developer.mozilla.org/en-US/docs/Web/API/VideoEncoder/configure#config)\n\u003ca name=\"WebCodecsEncoderOptions\"\u003e\u003c/a\u003e\n\n## WebCodecsEncoderOptions : \u003ccode\u003eobject\u003c/code\u003e\n\n**Kind**: global typedef\n**Properties**\n\n| Name              | Type                                                                           | Default         |\n| ----------------- | ------------------------------------------------------------------------------ | --------------- |\n| [groupOfPictures] | \u003ccode\u003enumber\u003c/code\u003e                                                            | \u003ccode\u003e20\u003c/code\u003e |\n| [flushFrequency]  | \u003ccode\u003enumber\u003c/code\u003e                                                            | \u003ccode\u003e10\u003c/code\u003e |\n| [encoderOptions]  | [\u003ccode\u003eWebCodecsEncoderEncoderOptions\u003c/code\u003e](#WebCodecsEncoderEncoderOptions) | \u003ccode\u003e{}\u003c/code\u003e |\n\n\u003ca name=\"WebCodecsEncoderEncoderOptions\"\u003e\u003c/a\u003e\n\n## WebCodecsEncoderEncoderOptions : \u003ccode\u003eVideoEncoderConfig\u003c/code\u003e\n\n**Kind**: global typedef\n**See**: [VideoEncoder.configure](https://developer.mozilla.org/en-US/docs/Web/API/VideoEncoder/configure#config)\n\u003ca name=\"WebCodecsMuxerOptions\"\u003e\u003c/a\u003e\n\n## WebCodecsMuxerOptions : \u003ccode\u003eMuxerOptions\u003c/code\u003e\n\n**Kind**: global typedef\n**See**\n\n- [Mp4.MuxerOptions](https://github.com/Vanilagy/mp4-muxer/#usage)\n- [WebM.MuxerOptions](https://github.com/Vanilagy/webm-muxer/#usage)\n\n\u003ca name=\"onStatusChangeCb\"\u003e\u003c/a\u003e\n\n## onStatusChangeCb : \u003ccode\u003efunction\u003c/code\u003e\n\nA callback to notify on the status change. To compare with RecorderStatus enum values.\n\n**Kind**: global typedef\n\n| Param          | Type                | Description |\n| -------------- | ------------------- | ----------- |\n| RecorderStatus | \u003ccode\u003enumber\u003c/code\u003e | the status  |\n\n\u003ca name=\"RecorderOptions\"\u003e\u003c/a\u003e\n\n## RecorderOptions : \u003ccode\u003eobject\u003c/code\u003e\n\nOptions for recording. All optional.\n\n**Kind**: global typedef\n**Properties**\n\n| Name             | Type                                               | Default                                           | Description                                                                                                             |\n| ---------------- | -------------------------------------------------- | ------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------- |\n| [name]           | \u003ccode\u003estring\u003c/code\u003e                                | \u003ccode\u003e\u0026quot;\\\u0026quot;\\\u0026quot;\u0026quot;\u003c/code\u003e           | A name for the recorder, used as prefix for the default file name.                                                      |\n| [duration]       | \u003ccode\u003enumber\u003c/code\u003e                                | \u003ccode\u003e10\u003c/code\u003e                                   | The recording duration in seconds. If set to Infinity, `await canvasRecorder.stop()` needs to be called manually.       |\n| [frameRate]      | \u003ccode\u003enumber\u003c/code\u003e                                | \u003ccode\u003e30\u003c/code\u003e                                   | The frame rate in frame per seconds. Use `await canvasRecorder.step();` to go to the next frame.                        |\n| [download]       | \u003ccode\u003eboolean\u003c/code\u003e                               | \u003ccode\u003etrue\u003c/code\u003e                                 | Automatically download the recording when duration is reached or when `await canvasRecorder.stop()` is manually called. |\n| [extension]      | \u003ccode\u003estring\u003c/code\u003e                                | \u003ccode\u003e\u0026quot;\\\u0026quot;mp4\\\u0026quot;\u0026quot;\u003c/code\u003e        | Default file extension: infers which Encoder is selected.                                                               |\n| [target]         | \u003ccode\u003estring\u003c/code\u003e                                | \u003ccode\u003e\u0026quot;\\\u0026quot;in-browser\\\u0026quot;\u0026quot;\u003c/code\u003e | Default writing target: in-browser or file-system when available.                                                       |\n| [encoder]        | \u003ccode\u003eobject\u003c/code\u003e                                |                                                   | A specific encoder. Default encoder based on options.extension: GIF \u003e WebCodecs \u003e H264MP4.                              |\n| [encoderOptions] | \u003ccode\u003eobject\u003c/code\u003e                                |                                                   | See `src/encoders` or individual packages for a list of options.                                                        |\n| [muxerOptions]   | \u003ccode\u003eobject\u003c/code\u003e                                |                                                   | See \"mp4-muxer\" and \"webm-muxer\" for a list of options.                                                                 |\n| [frameOptions]   | \u003ccode\u003eobject\u003c/code\u003e                                |                                                   | Options for createImageBitmap(), VideoFrame or canvas-screenshot.                                                       |\n| [onStatusChange] | [\u003ccode\u003eonStatusChangeCb\u003c/code\u003e](#onStatusChangeCb) |                                                   |                                                                                                                         |\n\n\u003ca name=\"RecorderStartOptions\"\u003e\u003c/a\u003e\n\n## RecorderStartOptions : \u003ccode\u003eobject\u003c/code\u003e\n\nOptions for recording initialisation. All optional.\n\n**Kind**: global typedef\n**Properties**\n\n| Name       | Type                 | Description                                                                   |\n| ---------- | -------------------- | ----------------------------------------------------------------------------- |\n| [filename] | \u003ccode\u003estring\u003c/code\u003e  | Overwrite the file name completely.                                           |\n| [initOnly] | \u003ccode\u003eboolean\u003c/code\u003e | Only initialised the recorder and don't call the first await recorder.step(). |\n\n\u003c!-- api-end --\u003e\n\n## License\n\nAll MIT:\n\n- [mp4-wasm](https://github.com/mattdesl/mp4-wasm/blob/master/LICENSE.md)\n- [h264-mp4-encoder](https://github.com/TrevorSundberg/h264-mp4-encoder/blob/master/LICENSE.md)\n- [@ffmpeg/ffmpeg](https://github.com/ffmpegwasm/ffmpeg.wasm/blob/master/LICENSE)\n- [gifenc](https://github.com/mattdesl/gifenc/blob/master/LICENSE.md)\n- [webm-muxer](https://github.com/Vanilagy/webm-muxer/blob/main/LICENSE)\n- [mp4-muxer](https://github.com/Vanilagy/mp4-muxer/blob/main/LICENSE)\n\nMIT. See [license file](https://github.com/dmnsgn/canvas-record/blob/main/LICENSE.md).\n","funding_links":["https://paypal.me/dmnsgn","https://commerce.coinbase.com/checkout/56cbdf28-e323-48d8-9c98-7019e72c97f3"],"categories":["JavaScript"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdmnsgn%2Fcanvas-record","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdmnsgn%2Fcanvas-record","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdmnsgn%2Fcanvas-record/lists"}