Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/pankod/canvas2video
canvas2video is a backend solution for creating and rendering dynamic videos.
https://github.com/pankod/canvas2video
canvas ffmepg rendering typescript
Last synced: 14 days ago
JSON representation
canvas2video is a backend solution for creating and rendering dynamic videos.
- Host: GitHub
- URL: https://github.com/pankod/canvas2video
- Owner: pankod
- License: gpl-3.0
- Created: 2020-08-25T09:25:52.000Z (about 4 years ago)
- Default Branch: master
- Last Pushed: 2021-03-23T09:41:05.000Z (over 3 years ago)
- Last Synced: 2024-10-19T07:03:52.104Z (25 days ago)
- Topics: canvas, ffmepg, rendering, typescript
- Language: TypeScript
- Homepage: https://pankod.com
- Size: 24.6 MB
- Stars: 280
- Watchers: 13
- Forks: 38
- Open Issues: 12
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
@pankod/canvas2video
Create dynamic, data-driven videos on the fly.
[![Maintainability](https://api.codeclimate.com/v1/badges/ce77e17d733e937fbf3b/maintainability)](https://codeclimate.com/github/pankod/canvas2video/maintainability)
[![Test Coverage](https://api.codeclimate.com/v1/badges/ce77e17d733e937fbf3b/test_coverage)](https://codeclimate.com/github/pankod/canvas2video/test_coverage)
[![npm version](https://img.shields.io/npm/v/@pankod/canvas2video.svg)](https://www.npmjs.com/package/@pankod/canvas2video)
![npm](https://img.shields.io/npm/dm/@pankod/canvas2video)
[![dependencies Status](https://david-dm.org/pankod/canvas2video/status.svg)](https://david-dm.org/pankod/canvas2video)
[![dev-dependencies Status](https://david-dm.org/pankod/canvas2video/dev-status.svg)](https://david-dm.org/pankod/canvas2video?type=dev) [![Meercode CI Score](https://meercode.io/badge/pankod/canvas2video?type=ci-score&branch=master)](https://meercode.io/pankod/canvas2video)
## About
@pankod/canvas2video is a backend solution for creating and rendering dynamic videos. It lets you build web canvas scenes by using the *Cairo-backed* [fabric](https://github.com/fabricjs/fabric.js) library and add animations with [gsap](https://github.com/greensock/GSAP).
Your animation timeline will be rendered frame by frame and piped to ffmpeg renderer for the final video output.## Use Cases
📺 Personalized video advertising
🎞️ Programmatical customization of video templates
⛅ Creating dynamic videos with real-time data (See: [Weather Example ](./examples) - [Youtube](https://www.youtube.com/watch?v=xv8M3ScElv0))
## Getting started
To install the module, run the following in the command line:
```bash
npm install @pankod/canvas2video --save
```or
```bash
yarn add @pankod/canvas2video
```## Usage
`renderer` expects a `makeScene` function where you create your canvas animation by using [fabric](https://github.com/fabricjs/fabric.js) and
[gsap](https://github.com/greensock/GSAP) methods. It returns a *stream of frames* to be consumed by the `encoder` in the next step.Below is a basic example of a one-second rotation animation of "Hello World" text. After rendering the animation and encoding the video, the output will be saved to `output/hello-world.mp4`.
```js
import { renderer, encoder } from "@pankod/canvas2video";const helloWorld = async () => {
const stream = await renderer({
silent: false,
width: 1920,
height: 1080,
fps: 30,
makeScene: (fabric, canvas, anim, compose) => {
const text = new fabric.Text("Hello world", {
left: 400,
top: 400,
fontSize: 100,
fill: "#f99339",
angle: 0,
});
canvas.add(text);
anim.to(text, {
duration: 1,
angle: 360,
ease: Power3.easeOut,
});
compose();
},
});const output = await encoder({
silent: false,
frameStream: stream,
output: "output/hello-world.mp4",
fps: {
input: 30,
output: 30,
},
});
console.log("process done,", output.path);
};
```You may refer the following documentations to learn how the construct your own `makeScene` methods:
📃[Fabric.js Documentation](http://fabricjs.com/docs/)
📃[GSAP Documentation](https://greensock.com/docs/)
You can optionally provide the `encoder` function a `backgroundVideo` object. In this case, your animation will be used as an overlay layer and merged with the background video. More information about the usage of background videos is given in the *Options* section.
## Examples
You'll find two working demos int the [examples](./examples) folder folder of the project. Give them a try by following the steps below:
#### **Check out examples**
```bash
$ git clone https://github.com/pankod/canvas2video.git
````
```
$ cd examples
```
```
$ npm i
```
After this, you can run commands at the below then check examples/output directory:
#### **Example 1**```bash
$ npm run start:hello-world
```#### **Example 2**
```bash
$ npm run start:weather
```
## Options
### **Renderer**
| Properties | Type | Description |
| ------------------------------- | ---------- | ------------------------------------ |
| **width**
\*_required_ | `number` | canvas width |
| **height**
\*_required_ | `number` | canvas height |
| **fps**
\*_required_ | `number` | animation fps |
| **makeScene**
\*_required_ | `function` | [See below](#makeScene) |
#### **_makeScene_**
The function takes 4 arguments(fabric, canvas, anim and compose) which is passed by the `renderer` function.
```js
renderer({
/* .. */
makeScene: (fabric, canvas, anim, compose) => {
/**
* your code to create and manipulate your canvas
*/
},
});
```| _Parameter_ | _Type_ | |
| ----------- | ------------------- | --------------------------------------------- |
| **fabric** | fabric.js instance | [Repo](https://github.com/fabricjs/fabric.js) |
| **canvas** | fabric.StaticCanvas | [Repo](https://github.com/fabricjs/fabric.js) |
| **anim** | gsap.TimelineMax | [Repo](https://github.com/greensock/GSAP) |
| **compose** | () => void |
### **Encoder**
| Properties | Type | Description |
| --------------------------------- | ---------- | ----------------------------------- |
| **frameStream**
\*_required_ | `Readable` | `renderer` function return value |
| **output**
\*_required_ | `string` | output file path |
| **fps**
\*_required_ | `Object` | `{ input: number, output: number }` |
| **backgroundVideo** | `Object` | [See below](#backgroundVideo) |
#### **_backgroundVideo_**
```ts
backgroundVideo: {
videoPath: string, // your background video path
inSeconds: number, // video start time in seconds
outSeconds: number, // video end time in seconds
}
```
## To-do
📌 [Lottie](https://airbnb.design/lottie/) animation support
📌 Thread & concurrency management
📌 Finer control over encoder settings
## License
[License](./LICENSE)