1、 背景和需求
在许多实时视频应用场景中,我们需要动态生成实时视频流并将其推送到 RTMP 服务器。例如,我们可能需要生成一个实时显示当前时间的视频流,或者在游戏直播时显示实时弹幕等。本文将介绍如何使用 Node.js、Canvas 和 FFmpeg 实现这一需求。
本文将分为两个部分。第一部分将介绍如何使用 Node.js、Canvas 和 FFmpeg 生成一个包含 100 帧图像的静态视频文件。第二部分将基于第一部分的内容,介绍如何实时生成并推送视频流到 RTMP 服务器。
在开始实现之前,我们需要先确保安装了以下依赖:
-
Node.js
-
Canvas
-
Fluent-ffmpeg
-
Moment
接下来,我们将分别介绍两个部分的实现。
2、生成静态视频文件
2.1 准备环境和依赖
首先,我们需要引入相关库和模块,如 canvas、fluent-ffmpeg、moment、path 和 fs。
const { createCanvas } = require("canvas");
const ffmpeg = require("fluent-ffmpeg");
const moment = require("moment");
const path = require("path");
const fs = require("fs");
接着,我们设置视频的宽度、高度和帧率。
const width = 640;
const height = 480;
const fps = 30;
2.2 创建 Canvas 并绘制帧
创建一个 canvas 并获取 2D 绘图上下文。
const canvas = createCanvas(width, height);
const ctx = canvas.getContext("2d");
定义一个 gerneateFrame 函数,它会接收一个帧序号作为参数,然后绘制帧上的文本信息,包括帧序号和当前时间,将帧内容保存为一个 PNG 图片。
const gerneateFrame = async (frameNum) => {
const time = moment().format("YYYY-MM-DD HH:mm:ss");
const text = `frame: ${frameNum}, time: ${time}`;
ctx.clearRect(0, 0, width, height);
ctx.fillStyle = "white";
ctx.font = "30px Arial";
ctx.fillText(text, 10, height / 2);
const filename = `frame-${frameNum.toString().padStart(5, "0")}.png