UNPKG

web-video-creator

Version:

A framework for creating videos based on Node.js + Puppeteer + FFmpeg.

1,025 lines (802 loc) 24.7 kB
# 低级别 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>