萤石码流本地录制插件
基于萤石播放器(@ezuikit/player-ezopen)的码流本地录制插件,在浏览器端把实时/回放码流录制为可下载的 MP4 文件。支持「水印录制(硬解转码)」与「原始码流录制」两种模式,并可选采集原始码流用于问题排查。
- 播放器(ezopen)插件化接入,通过
player.use(plugin)一行注册。 - 两种录制模式自动切换:
- 水印录制:硬解(
decodeEngine === 1)下经 WASM 编码器转码后录制,产物为 H264 + AAC,画面尺寸随视频动态调整,最大1920x1080。 - 原始码流录制:软解或关闭水印录制时,直接写入原始分片,不做转码。
- 水印录制:硬解(
- 录制产物为 MP4,支持自动下载或交由回调自定义处理。
- 支持加密流录制(传入
secretKey)。 - 与播放器生命周期联动:
stop/pause自动停止录制,destroy自动销毁。 - 可选的原始码流另存能力(
debugRecordRaw),用于码流分析与问题定位。 - 底层录制类
Record可独立使用,适配自定义码流接入场景。
# npm
npm install @ezuikit/player-plugin-record
# pnpm
pnpm add @ezuikit/player-plugin-record
# yarn
yarn add @ezuikit/player-plugin-record该插件需配合萤石播放器
@ezuikit/player-ezopen使用。
import EZopenPlayer from "@ezuikit/player-ezopen";
import { PlayerPluginRecord } from "@ezuikit/player-plugin-record";
// 播放地址 url 和 accessToken 从萤石开放平台获取
// https://open.ys7.com/console/device.html
const player = new EZopenPlayer({
id: "app",
url: "ezopen player url",
accessToken: "accessToken",
width: 600,
height: 400,
});
// 创建并注册录制插件
const recordPlugin = new PlayerPluginRecord();
player.use(recordPlugin);
// 开始录制
recordPlugin.startRecord("my-record");
// 停止录制(也会在播放器 stop/pause 时自动触发)
// recordPlugin.stopRecord();
// 销毁插件(也会在播放器 destroy 时自动触发)
// recordPlugin.destroy();录制插件主类,配合 EZopenPlayer 使用。
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
downloadRecord |
boolean |
true |
停止录制时是否自动下载录制文件。 |
staticPath |
string |
"." |
底层转码库 libSystemTransformWASM.js 的资源路径前缀,支持绝对地址与相对地址(内部会解析为绝对地址)。 |
enabledWatermarkRecord |
boolean |
true |
是否启用水印录制分支。true 时在硬解下经转码后录制(H264 + AAC,最大 1920x1080);false 时走原始码流录制,不做转码。 |
debugRecordRaw |
boolean |
false |
是否在录制过程中同步收集并下载原始码流,仅用于调试/码流分析,请勿在生产环境开启。仅在原始码流录制分支(enabledWatermarkRecord = false)下生效。 |
| 属性 | 类型 | 说明 |
|---|---|---|
name |
string |
插件名称,固定为 ezuikit-player-plugin-record。 |
recording |
boolean |
当前是否处于录制中。 |
-
startRecord(fileName?, stopCallBack?, secretKey?): Promise<string>fileName?: string录制文件名,默认使用当前时间戳。stopCallBack?: (url: string, file: Blob) => void录制结束回调,返回文件地址与文件对象。secretKey?: string码流验证码(仅加密流需要)。- 开始录制。若正在录制或缺少码流头则直接返回。
-
stopRecord(): Promise<string | void>- 停止录制。根据
downloadRecord决定是否下载文件。
- 停止录制。根据
-
destroy(): void- 停止录制并销毁插件内部资源。
-
exec(player): void- 插件注册入口,由
player.use(plugin)内部调用,一般无需手动调用。
- 插件注册入口,由
底层录制类,可脱离插件独立使用,适合自定义码流接入。
import { Record } from "@ezuikit/player-plugin-record";
const record = new Record({ downloadRecord: true });
record.startRecord(head /* 40 字节海康流头 */);
record.inputData(chunk); // 持续输入码流分片
record.stopRecord();
record.destroy();| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
downloadRecord |
boolean |
true |
是否下载录制文件。 |
staticPath |
string |
"." |
底层转码库资源路径前缀,需可解析为绝对地址。 |
Record.getHKHead(type, videoCodec, audioCodec, audioSimpleRate): Uint8Array- 构造 40 字节海康码流头。
type:"flv" | "ps" | "rtp" | "ts"videoCodec:"h264" | "h265"audioCodec:"aac" | "g711_a" | "g711_u" | "g722"audioSimpleRate:"8000" | "16000" | "32000" | "44100" | "48000"
| 方法 | 说明 |
|---|---|
startRecord(aHead, name?, stopCallBack?, secretKey?) |
开始录像。aHead 必须为海康 40 字节流头;FLV 流仅支持 AAC + 16K 音频。 |
inputData(buff) |
往录像存储输入码流数据。 |
inputWatermarkData(rawData, info?) |
输入水印(转码)码流数据。 |
stopRecord() |
停止录像,并按 downloadRecord 决定是否下载。 |
destroy() |
销毁录制对象。 |
| 模式 | 触发条件 | 产物 | 说明 |
|---|---|---|---|
| 水印录制 | enabledWatermarkRecord = true(默认)且播放器为硬解(decodeEngine === 1) |
H264 + AAC MP4 | 经 WASM 编码器转码,画面尺寸随视频动态调整,最大 1920x1080。可录制带水印画面。 |
| 原始码流录制 | 软解,或 enabledWatermarkRecord = false |
原始码流封装 MP4 | 直接写入原始分片,不做转码。可配合 debugRecordRaw 另存原始码流。 |
- 水印录制仅在硬解下可用;软解环境会自动回退为原始码流录制。
- 开启水印录制后,录制视频编码会转为 H264、音频转为 AAC,尺寸最大
1920x1080;部分浏览器可能出现音频转码失败,或录制文件仅有音频、无法渲染画面的情况。 debugRecordRaw仅用于调试,会额外产生.raw文件下载,请勿在生产环境开启。staticPath用于加载底层转码库libSystemTransformWASM.js;当浏览器new Blob加载失败时,将回退到该路径加载,务必保证其可访问。- 插件会自动监听播放器
stop/pause停止录制、destroy销毁,无需重复处理。