web-video-creator
Version:
A framework for creating videos based on Node.js + Puppeteer + FFmpeg.
1,025 lines (802 loc) • 24.7 kB
Markdown
# 低级别 API
```javascript
import { core } from "web-video-creator"
// 低级API在core暴露
const { ... } = core;
```
# ResourcePool
资源池
## 构造函数
### new ResourcePool(options: Object)
#### options 参数
<table width="100%">
<thead>
<tr>
<th>参数</th>
<th>类型</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>numBrowserMin</td>
<td>number</td>
<td>资源池最小浏览器实例数量</td>
</tr>
<tr>
<td>numBrowserMax</td>
<td>number</td>
<td>资源池最大浏览器实例数量</td>
</tr>
<tr>
<td>browserOptions</td>
<td>Object</td>
<td>浏览器选项,参考 <<a href="#browser">Browser</a> 构造函数的options参数</td>
</tr>
<tr>
<td>browserOptions.pageOptions</td>
<td>Object</td>
<td>浏览器页面选项,参考 <a href="#page">Page</a> 构造函数的options参数</td>
</tr>
</tbody>
</table>
## 成员
### ResourcePool.warmup(): Promise
预热资源池,当渲染任务产生时可以快速启动渲染。
### ResourcePool.acquirePage(): Promise<[Page](#page)>
从资源池获取一个页面封装实例,请记得 page 对象使用完毕后调用 [page.release()](#pagerelease-promise) 释放它。
### ResourcePool.acquireBrowser(): Promise<[Browser](#browser)>
从资源池获取一个浏览器封装实例,请记得 browser 对象使用完毕后调用 [browser.release()](#browserrelease-promise) 释放它。
### ResourcePool.isBusy(): boolean
判断浏览器资源池是否饱和
<br>
# Browser
浏览器封装
## 构造函数
### new Browser(options: Object)
#### options 参数
<table width="100%">
<thead>
<tr>
<th>参数</th>
<th>类型</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>numPageMin</td>
<td>number</td>
<td>页面资源最小数量</td>
</tr>
<tr>
<td>numPageMax</td>
<td>number</td>
<td>页面资源最大数量</td>
</tr>
<tr>
<td>executablePath</td>
<td>string</td>
<td>浏览器可执行文件路径</td>
</tr>
<tr>
<td>useGPU</td>
<td>boolean</td>
<td>是否使用GPU加速渲染,建议开启</td>
</tr>
<tr>
<td>useAngle</td>
<td>boolean</td>
<td>渲染后端是否使用Angle,建议开启</td>
</tr>
<tr>
<td>disableDevShm</td>
<td>boolean</td>
<td>是否禁用共享内存,当/dev/shm较小时建议开启此选项,默认关闭</td>
</tr>
<tr>
<td>args</td>
<td>string[]</td>
<td>浏览器flags参数列表</td>
</tr>
<tr>
<td>pageOptions</td>
<td>Object</td>
<td>页面选项,参考 <a href="#page">Page</a> 构造函数的options参数</td>
</tr>
</tbody>
</table>
## 成员
### Browser.init(): Promise
初始化浏览器
### Browser.acquirePage(): Promise<[Page](#page)>
从浏览器封装获取一个页面封装实例,请记得 page 对象使用完毕后调用 [page.release()](#pagerelease-promise) 释放它。
### Browser.release(): Promise
释放浏览器封装自身,将被回收到资源池进行下一次分配。
### Browser.close(): Promise
关闭浏览器,将通知资源池销毁浏览器资源
### Browser.getPageCount(): Promise<number>
获取浏览器已开启的页面数量
### Browser.isUninitialized(): boolean
判断浏览器是否未初始化
### Browser.isReady(): boolean
判断浏览器是否已就绪
### Browser.isUnavailabled(): boolean
判断浏览器是否不可用
### Browser.isClosed(): boolean
判断浏览器是否已关闭
### Browser.isBusy(): boolean
判断浏览器页面池是否饱和
<br>
# Page
页面封装
## 构造函数
### new Page(options: Object)
#### options 参数
<table width="100%">
<thead>
<tr>
<th>参数</th>
<th>类型</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>width</td>
<td>number</td>
<td>页面初始化视窗宽度,可通过setViewport调整</td>
</tr>
<tr>
<td>height</td>
<td>number</td>
<td>页面初始化视窗高度,可通过setViewport调整</td>
</tr>
<tr>
<td>userAgent</td>
<td>string</td>
<td>访问页面时的用户UA</td>
</tr>
<tr>
<td>beginFrameTimeout</td>
<td>number</td>
<td>BeginFrame超时时间(毫秒),默认5000毫秒</td>
</tr>
<tr>
<td>frameFormat</td>
<td>string</td>
<td>帧图格式(jpeg/png),建议使用jpeg提高性能</td>
</tr>
<tr>
<td>frameQuality</td>
<td>number</td>
<td>帧图质量(0-100),默认80</td>
</tr>
</tbody>
</table>
## 成员
### Page.init(): Promise
初始化页面
### Page.setViewport(options: Object): Promise
设置视窗参数
#### options 参数
与Puppeteer的[Viewport](https://pptr.dev/api/puppeteer.viewport#properties)保持一致。
### Page.goto(url: string, waitForOptions: Object): Promise
导航到待渲染页面。
#### url 参数
本地 URL 或远端 HTTPS URL,受制于浏览器的[安全上下文限制](https://w3c.github.io/webappsec-secure-contexts/),只能访问 localhost / 127.0.0.1 或者使用 HTTPS 协议且证书有效的域
#### waitForOptions 参数
与Puppeteer的[WaitForOptions](https://pptr.dev/api/puppeteer.waitforoptions)保持一致。
### Page.setContent(content: string, waitForOptions: Object): Promise
设置待渲染页面内容。
#### content 参数
可见的HTML内容。
#### waitForOptions 参数
与Puppeteer的[WaitForOptions](https://pptr.dev/api/puppeteer.waitforoptions)保持一致。
### Page.registerFont(options: Object)
注册字体
#### options 参数
参考 [Font](#font) 字体参数。
### Page.registerFonts([options: Object, ...])
注册多个字体
#### options 参数
参考 [Font](#font) 字体参数。
### Page.registerTimeActions(actions: {[key: Number]: Function})
注册动作序列
#### actions 参数
动作序列对象
### Page.waitForFontsLoaded(timeout: number): Promise
等待字体加载完成。
#### timeout 参数
超时时间(毫秒),默认 30000 毫秒
### Page.startScreencast(options: Object): Promise
开始帧图流捕获
#### options 参数
<table width="100%">
<thead>
<tr>
<th>参数</th>
<th>类型</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>fps</td>
<td>number</td>
<td>渲染帧率</td>
</tr>
<tr>
<td>duration</td>
<td>number</td>
<td>渲染时长(毫秒)</td>
</tr>
<tr>
<td>frameCount</td>
<td>number</td>
<td>渲染总帧数</td>
</tr>
<tr>
<td>autostart</td>
<td>boolean</td>
<td>是否自动启动渲染,默认true</td>
</tr>
</tbody>
</table>
### Page.pauseScreencast(): Promise
暂停帧图流捕获
### Page.resumeScreencast(): Promise
恢复帧图流捕获
### Page.stopScreencast(): Promise
停止帧图流捕获
### Page.getCaptureContextConfig(): Promise
获取页面中全局的 `captureCtx.config` 配置内容。
### Page.reset(): Promise
重置页面封装,重置后可开始新的捕获。
### Page.release(): Promise
释放页面封装自身,将被回收到页面池进行下一次分配。
### Page.close(): Promise
关闭页面,将通知浏览器封装销毁页面资源
### Page.isUninitialized(): boolean
判断页面是否未初始化
### Page.isReady(): boolean
判断页面是否已就绪
### Page.isUnavailabled(): boolean
判断页面是否不可用
### Page.isClosed(): boolean
判断页面是否已关闭
<br>
# Synthesizer
合成器
## 构造函数
### new Synthesizer(options: Object)
#### options 参数
<table width="100%">
<thead>
<tr>
<th>参数</th>
<th>类型</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>outputPath</td>
<td>string</td>
<td>导出视频路径</td>
</tr>
<tr>
<td>width</td>
<td>number</td>
<td>视频宽度</td>
</tr>
<tr>
<td>height</td>
<td>number</td>
<td>视频高度</td>
</tr>
<tr>
<td>duration</td>
<td>number</td>
<td>视频时长</td>
</tr>
<tr>
<td>fps</td>
<td>number</td>
<td>视频合成帧率,默认30</td>
</tr>
<tr>
<td>format</td>
<td>string</td>
<td>导出视频格式(mp4/webm),默认通过输出文件路径后缀判断</td>
</tr>
<tr>
<td>attachCoverPath</td>
<td>string</td>
<td>附加到视频首帧的封面路径</td>
</tr>
<tr>
<td>coverCapture</td>
<td>boolean</td>
<td>是否捕获封面并输出,默认false</td>
</tr>
<tr>
<td>coverCaptureTime</td>
<td>number</td>
<td>封面捕获时间点(毫秒),默认捕获时间点是视频的20%位置</td>
</tr>
<tr>
<td>coverCaptureFormat</td>
<td>string</td>
<td>封面捕获格式(jpg/png/bmp),默认jpg</td>
</tr>
<tr>
<td>videoEncoder</td>
<td>string</td>
<td>视频编码器,编码器选择请参考 <a href="./video-encoder.md">视频编码器列表</a></td>
</tr>
<tr>
<td>videoQuality</td>
<td>number</td>
<td>视频质量(0-100),默认100</td>
</tr>
<tr>
<td>videoBitrate</td>
<td>string</td>
<td>视频码率(设置码率将忽略videoQuality)</td>
</tr>
<tr>
<td>pixelFormat</td>
<td>string</td>
<td>像素格式(yuv420p/yuv444p/rgb24),默认yuv420p</td>
</tr>
<tr>
<td>audioEncoder</td>
<td>string</td>
<td>音频编码器,默认aac</td>
</tr>
<tr>
<td>audioBitrate</td>
<td>string</td>
<td>音频码率</td>
</tr>
<tr>
<td>volume</td>
<td>number</td>
<td>视频音量(0-100),默认100</td>
</tr>
<tr>
<td>parallelWriteFrames</td>
<td>number</td>
<td>并行写入帧数,默认10</td>
</tr>
<tr>
<td>showProgress</td>
<td>boolean</td>
<td>是否在命令行展示进度,默认false</td>
</tr>
</tbody>
</table>
### Synthesizer.start()
启动合成。
### Synthesizer.abort()
终止合成,非特殊情况一般不要中断渲染。
### Synthesizer.input(buffer: Buffer)
输入帧数据。
#### buffer 参数
使用 Buffer 对象存储的帧图二进制数据,输入后将流式传输到 FFmpeg。
### Synthesizer.endInput()
结束帧图流的输入,通知 FFmpeg 所有帧已经输入完成等待合成完成。
### Synthesizer.addAudio(options: Object)
添加音频。
#### options 参数
参考 [Audio](#audio) 音频参数。
### Synthesizer.addAudios([options: Object, ...])
添加多个音频
#### options 参数
参考 [Audio](#audio) 音频参数。
### Synthesizer.removeOutputFile(): Promise
移除输出文件。
### Synthesizer.reset()
重置合成器,重置后可以重新输入帧。
### Synthesizer.isReady(): boolean
合成器是否已就绪
### Synthesizer.isSynthesizing(): boolean
合成器是否正在合成中
### Synthesizer.isCompleted(): boolean
合成器是否已经合成完成
<br>
# VideoChunk
视频块
## 构造函数
### new VideoChunk(options: Object)
#### options 参数
<table width="100%">
<thead>
<tr>
<th>参数</th>
<th>类型</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>width</td>
<td>number</td>
<td>视频宽度</td>
</tr>
<tr>
<td>height</td>
<td>number</td>
<td>视频高度</td>
</tr>
<tr>
<td>duration</td>
<td>number</td>
<td>视频时长</td>
</tr>
<tr>
<td>fps</td>
<td>number</td>
<td>视频合成帧率,默认30</td>
</tr>
<tr>
<td>outputPath</td>
<td>string</td>
<td>导出视频分块路径,默认存储在临时目录,路径必须使用.ts后缀</td>
</tr>
<tr>
<td>transition</td>
<td>string | <a href="#transition">Transition</a></td>
<td>进入下一视频分块的转场</td>
</tr>
<tr>
<td>autoremove</td>
<td>boolean</td>
<td>分块被合并后是否自动删除分块文件,默认true</td>
</tr>
<tr>
<td>videoEncoder</td>
<td>string</td>
<td>视频编码器,编码器选择请参考 <a href="./video-encoder.md">视频编码器列表</a></td>
</tr>
<tr>
<td>videoQuality</td>
<td>number</td>
<td>视频质量(0-100),默认100</td>
</tr>
<tr>
<td>videoBitrate</td>
<td>string</td>
<td>视频码率(设置码率将忽略videoQuality)</td>
</tr>
<tr>
<td>pixelFormat</td>
<td>string</td>
<td>像素格式(yuv420p/yuv444p/rgb24),默认yuv420p</td>
</tr>
<tr>
<td>parallelWriteFrames</td>
<td>number</td>
<td>并行写入帧数,默认10</td>
</tr>
<tr>
<td>showProgress</td>
<td>boolean</td>
<td>是否在命令行展示进度,默认false</td>
</tr>
</tbody>
</table>
### VideoChunk.start()
启动合成。
### VideoChunk.abort()
终止合成,非特殊情况一般不要中断渲染。
### VideoChunk.input(buffer: Buffer)
输入帧数据。
#### buffer 参数
使用 Buffer 对象存储的帧图二进制数据,输入后将流式传输到 FFmpeg。
### VideoChunk.endInput()
结束帧图流的输入,通知 FFmpeg 所有帧已经输入完成等待合成完成。
### VideoChunk.addAudio(options: Object)
添加音频。
#### options 参数
参考 [Audio](#audio) 音频参数。
### VideoChunk.addAudios([options: Object, ...])
添加多个音频
### VideoChunk.setTransition(options: Object)
设置转场效果
#### options 参数
参考 [Transition](#transition) 转场参数。
### VideoChunk.reset()
重置视频分块,重置后可以重新输入帧。
### VideoChunk.isReady(): boolean
视频分块是否已就绪
### VideoChunk.isSynthesizing(): boolean
视频分块是否正在合成中
### VideoChunk.isCompleted(): boolean
视频分块是否已经合成完成
<br>
# ChunkSynthesizer
视频分块合成器
## 构造函数
### new ChunkSynthesizer(options: Object)
#### options 参数
<table width="100%">
<thead>
<tr>
<th>参数</th>
<th>类型</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>outputPath</td>
<td>string</td>
<td>导出视频路径</td>
</tr>
<tr>
<td>width</td>
<td>number</td>
<td>视频宽度</td>
</tr>
<tr>
<td>height</td>
<td>number</td>
<td>视频高度</td>
</tr>
<tr>
<td>chunks</td>
<td><a href="#videochunk">VideoChunk</a>[]</td>
<td>未渲染或已渲染的VideoChunk列表,可以是VideoChunk实例也可以是普通对象</td>
</tr>
<tr>
<td>duration</td>
<td>number</td>
<td>视频时长</td>
</tr>
<tr>
<td>fps</td>
<td>number</td>
<td>视频合成帧率,默认30</td>
</tr>
<tr>
<td>attachCoverPath</td>
<td>string</td>
<td>附加到视频首帧的封面路径</td>
</tr>
<tr>
<td>coverCapture</td>
<td>boolean</td>
<td>是否捕获封面并输出,默认false</td>
</tr>
<tr>
<td>coverCaptureTime</td>
<td>number</td>
<td>封面捕获时间点(毫秒),默认捕获时间点是视频的20%位置</td>
</tr>
<tr>
<td>coverCaptureFormat</td>
<td>string</td>
<td>封面捕获格式(jpg/png/bmp),默认jpg</td>
</tr>
<tr>
<td>videoEncoder</td>
<td>string</td>
<td>视频编码器,编码器选择请参考 <a href="./video-encoder.md">视频编码器列表</a></td>
</tr>
<tr>
<td>videoQuality</td>
<td>number</td>
<td>视频质量(0-100),默认100</td>
</tr>
<tr>
<td>videoBitrate</td>
<td>string</td>
<td>视频码率(设置码率将忽略videoQuality)</td>
</tr>
<tr>
<td>pixelFormat</td>
<td>string</td>
<td>像素格式(yuv420p/yuv444p/rgb24),默认yuv420p</td>
</tr>
<tr>
<td>audioEncoder</td>
<td>string</td>
<td>音频编码器,默认aac</td>
</tr>
<tr>
<td>audioBitrate</td>
<td>string</td>
<td>音频码率</td>
</tr>
<tr>
<td>volume</td>
<td>number</td>
<td>视频音量(0-100),默认100</td>
</tr>
<tr>
<td>parallelWriteFrames</td>
<td>number</td>
<td>并行写入帧数,默认10</td>
</tr>
<tr>
<td>showProgress</td>
<td>boolean</td>
<td>是否在命令行展示进度,默认false</td>
</tr>
</tbody>
</table>
### ChunkSynthesizer.start()
启动合成。
### ChunkSynthesizer.abort()
终止合成,非特殊情况一般不要中断渲染。
### ChunkSynthesizer.input(chunk: [VideoChunk](#videochunk), transition: [Transition](#transition))
输入视频分块。
#### chunk 参数
请参考 [VideoChunk](#videochunk) 。
#### transition 参数
请参考 [Transition](#transition) 。
### ChunkSynthesizer.addAudio(options: Object)
添加音频。
#### options 参数
参考 [Audio](#audio) 音频参数。
### ChunkSynthesizer.addAudios([options: Object, ...])
添加多个音频
### ChunkSynthesizer.reset()
重置合成器,重置后可以重新输入视频分块。
### ChunkSynthesizer.isReady(): boolean
合成器是否已就绪
### ChunkSynthesizer.isSynthesizing(): boolean
合成器是否正在合成中
### ChunkSynthesizer.isCompleted(): boolean
合成器是否已经合成完成
# Audio
音频参数
<table width="100%">
<thead >
<tr>
<th>参数</th>
<th>类型</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>url</td>
<td>string</td>
<td>音频URL,与path二选一</td>
</tr>
<tr>
<td>path</td>
<td>string</td>
<td>音频本地路径,与url二选一</td>
</tr>
<tr>
<td>startTime</td>
<td>number</td>
<td>起始时间点(毫秒)</td>
</tr>
<tr>
<td>endTime</td>
<td>number</td>
<td>结束时间点(毫秒)</td>
</tr>
<tr>
<td>loop</td>
<td>boolean</td>
<td>是否循环播放</td>
</tr>
<tr>
<td>volume</td>
<td>number</td>
<td>音量(0-100)</td>
</tr>
<tr>
<td>seekStart</td>
<td>number</td>
<td>裁剪起始时间点(毫秒)</td>
</tr>
<tr>
<td>seekEnd</td>
<td>number</td>
<td>裁剪结束实际点(毫秒)</td>
</tr>
<tr>
<td>fadeInDuration</td>
<td>number</td>
<td>淡入时长(毫秒)</td>
</tr>
<tr>
<td>fadeOutDuration</td>
<td>number</td>
<td>淡出时长(毫秒)</td>
</tr>
<tr>
<td>retryFetchs</td>
<td>number</td>
<td>重试拉取次数</td>
</tr>
<tr>
<td>ignoreCache</td>
<td>boolean</td>
<td>是否忽略本地缓存</td>
</tr>
</tbody>
</table>
# Transition
转场参数,请参考 [转场效果](./transition.md) 。
<table width="100%">
<thead >
<tr>
<th>参数</th>
<th>类型</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>id</td>
<td>string</td>
<td>转场ID(与滤镜名称一致)</td>
</tr>
<tr>
<td>duration</td>
<td>string</td>
<td>转场时长(毫秒)</td>
</tr>
</tbody>
</table>
# Font
字体参数
<table width="100%">
<thead >
<tr>
<th>参数</th>
<th>类型</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>url</td>
<td>string</td>
<td>字体URL,与path二选一</td>
</tr>
<tr>
<td>path</td>
<td>string</td>
<td>字体本地路径,与url二选一</td>
</tr>
<tr>
<td>family</td>
<td>string</td>
<td>字体集名称</td>
</tr>
<tr>
<td>style</td>
<td>string</td>
<td>字体样式</td>
</tr>
<tr>
<td>weight</td>
<td>number | string</td>
<td>字体粗细</td>
</tr>
<tr>
<td>format</td>
<td>string</td>
<td>字体格式</td>
</tr>
<tr>
<td>retryFetchs</td>
<td>number</td>
<td>重试拉取次数</td>
</tr>
<tr>
<td>ignoreCache</td>
<td>boolean</td>
<td>是否忽略本地缓存</td>
</tr>
</tbody>
</table>