@fly-cut/av-canvas
Version:
Combine Text, Image, Video, Audio, UserMedia, DisplayMedia to generate MediaStream. With [AVRcorder](../av-recorder/README.md) you can output MP4 streams and save them as local files or push them to the server.
190 lines (183 loc) • 6.62 kB
TypeScript
import { Combinator } from '@fly-cut/av-cliper';
import { ICombinatorOpts } from '@fly-cut/av-cliper';
import { VisibleSprite } from '@fly-cut/av-cliper';
/**
*
* 一个可交互的画布,让用户添加各种素材,支持基础交互(拖拽、缩放、旋转、时间偏移)
*
* 用于在 Web 环境中实现视频剪辑、直播推流工作台功能
*
* @description
*
- 添加/删除素材(视频、音频、图片、文字)
- 分割(裁剪)素材
- 控制素材在视频中的空间属性(坐标、旋转、缩放)
- 控制素材在视频中的时间属性(偏移、时长)
- 设置坐标系原点位置
- 实时预览播放
- 纯浏览器环境生成视频
* @see [直播录制](https://webav-tech.github.io/WebAV/demo/4_2-recorder-avcanvas)
* @see [视频剪辑](https://webav-tech.github.io/WebAV/demo/6_4-video-editor)
* @example
* const avCvs = new AVCanvas(document.querySelector('#app'), {
* bgColor: '#333',
* width: 1920,
* height: 1080,
* });
*
*/
export declare class AVCanvas {
#private;
on: <Type extends "activeSpriteChange" | "playing" | "timeupdate" | "paused">(type: Type, listener: {
timeupdate: (time: number) => void;
paused: () => void;
playing: () => void;
activeSpriteChange: (sprite: VisibleSprite | null) => void;
}[Type]) => (() => void);
/**
* 创建 `AVCanvas` 类的实例。
* @param attchEl - 要添加画布的元素。
* @param opts - 画布的选项
* @param opts.bgColor - 画布的背景颜色。
* @param opts.width - 画布的宽度。
* @param opts.height - 画布的高度。
*/
constructor(attchEl: HTMLElement, opts: {
bgColor: string;
} & IResolution);
/**
* 每 33ms 更新一次画布,绘制已添加的 Sprite
* @param opts - 播放选项
* @param opts.start - 开始播放的时间(单位:微秒)
* @param [opts.end] - 结束播放的时间(单位:微秒)。如果未指定,则播放到最后一个 Sprite 的结束时间
* @param [opts.playbackRate] - 播放速率。1 表示正常速度,2 表示两倍速度,0.5 表示半速等。如果未指定,则默认为 1
* @throws 如果开始时间大于等于结束时间或小于 0,则抛出错误
*/
play(opts: {
start: number;
end?: number;
playbackRate?: number;
}): void;
/**
* 暂停播放,画布内容不再更新
*/
pause(): void;
/**
* 预览 `AVCanvas` 指定时间的图像帧
*/
previewFrame(time: number): void;
/**
* 获取当前帧的截图图像 返回的是一个base64
*/
captureImage(): string;
get activeSprite(): VisibleSprite | null;
set activeSprite(s: VisibleSprite | null);
/**
* 添加 {@link VisibleSprite}
* @param args {@link VisibleSprite}
* @example
* const sprite = new VisibleSprite(
* new ImgClip({
* type: 'image/gif',
* stream: (await fetch('https://xx.gif')).body!,
* }),
* );
*/
addSprite: SpriteManager['addSprite'];
/**
* 删除 {@link VisibleSprite}
* @param args
* @returns
* @example
* const sprite = new VisibleSprite();
* avCvs.removeSprite(sprite);
*/
removeSprite: SpriteManager['removeSprite'];
/**
* 销毁实例
*/
destroy(): void;
/**
* 合成所有素材的图像与音频,返回实时媒体流 `MediaStream`
*
* 可用于 WebRTC 推流,或由 {@link [AVRecorder](../../av-recorder/classes/AVRecorder.html)} 录制生成视频文件
*
* @see [直播录制](https://webav-tech.github.io/WebAV/demo/4_2-recorder-avcanvas)
*
*/
captureStream(): MediaStream;
/**
* 创建一个视频合成器 {@link [Combinator](../../av-cliper/classes/Combinator.html)} 实例,用于将当前画布添加的 Sprite 导出为视频文件流
*
* @param opts - 创建 Combinator 的可选参数
* @throws 如果没有添加素材,会抛出错误
*
* @example
* avCvs.createCombinator().output() // => ReadableStream
*
* @see [视频剪辑](https://webav-tech.github.io/WebAV/demo/6_4-video-editor)
*/
createCombinator(opts?: ICombinatorOpts): Promise<Combinator>;
/**
* 设置背景图片
* @param image 背景图片(ImageBitmap、HTMLImageElement 或 URL)
* @param options 可选配置(如拉伸模式、透明度等)
*/
setBackgroundImage(image: ImageBitmap | HTMLImageElement | string, options?: {
mode?: 'cover' | 'contain' | 'stretch' | 'repeat';
opacity?: number;
blur?: number;
}): Promise<void>;
/**
* 更新背景图片的模糊效果或透明度
* @param options 可选配置(模式、透明度、模糊度)
*/
updateBackgroundOptions(options?: {
mode?: 'cover' | 'contain' | 'stretch' | 'repeat';
opacity?: number;
blur?: number;
}): Promise<void>;
/**
* 清除背景图片,恢复使用纯色背景
*/
clearBackgroundImage(): void;
/**
* 刷新当前画布内容
* @description 强制重新渲染当前画布的所有内容,包括背景和所有精灵
*/
refresh(): void;
/**
* 设置画布的坐标原点
* @param x - 原点的 x 坐标(0-1 之间表示百分比,大于 1 表示具体像素值)
* @param y - 原点的 y 坐标(0-1 之间表示百分比,大于 1 表示具体像素值)
*/
setAnchor(x: number, y: number): void;
}
declare enum ESpriteManagerEvt {
ActiveSpriteChange = "activeSpriteChange",
AddSprite = "addSprite"
}
/**
* 分辨率(尺寸)
*/
declare interface IResolution {
width: number;
height: number;
}
declare class SpriteManager {
#private;
on: <Type extends ESpriteManagerEvt>(type: Type, listener: {
addSprite: (s: VisibleSprite) => void;
activeSpriteChange: (s: VisibleSprite | null) => void;
}[Type]) => (() => void);
get activeSprite(): VisibleSprite | null;
set activeSprite(s: VisibleSprite | null);
addSprite(vs: VisibleSprite): Promise<void>;
removeSprite(spr: VisibleSprite): void;
getSprites(filter?: {
time: boolean;
}): VisibleSprite[];
updateRenderTime(time: number): void;
destroy(): void;
}
export { }