UNPKG

web-video-creator

Version:

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

342 lines (334 loc) 9.53 kB
/** 支持的格式枚举 */ export const SUPPORT_FORMAT = [ "mp4", "webm" ]; /** 视频编码器 */ export const VIDEO_ENCODER = { CPU: { /** * 使用CPU进行H264软编码 * 适配容器:mp4 * 建议更改使用其它硬编码方案加速合成 */ H264: "libx264", /** * 使用CPU进行H265软编码 * 适配容器:mp4 * 建议更改使用其它硬编码方案加速合成 */ H265: "libx265", /** * 使用CPU进行VP8软编码 * 适配容器:webm * 建议更改使用其它硬编码方案加速合成 */ VP8: "libvpx", /** * 使用CPU进行VP9软编码 * 适配容器:webm * 建议更改使用其它硬编码方案加速合成 */ VP9: "libvpx-vp9" }, INTEL: { /** * 使用Intel核显或独显的QSV加速H264编码 * 适配容器:mp4 */ H264: "h264_qsv", /** * 使用Intel核显或独显的QSV加速H265编码 * 适配容器:mp4 */ H265: "hevc_qsv", /** * 使用Intel核显或独显的QSV加速VP8编码 * 适配容器:webm */ VP8: "vp8_qsv", /** * 使用Intel核显或独显的QSV加速VP9编码 * 适配容器:webm */ VP9: "vp9_qsv" }, AMD: { /** * 使用AMD核显或独显的AMF加速H264编码 * 适配容器:mp4 */ H264: "h264_amf", /** * 使用AMD核显或独显的AMF加速H265编码 * 适配容器:mp4 */ H265: "h265_amf" }, NVIDIA: { /** * 使用Nvidia显卡NVENC加速H264编码 * 适配容器:mp4 * 通过 https://developer.nvidia.com/video-encode-and-decode-gpu-support-matrix-new 查看支持情况 */ H264: "h264_nvenc", /** * 使用Nvidia显卡NVENC加速H265编码 * 适配容器:mp4 * 通过 https://developer.nvidia.com/video-encode-and-decode-gpu-support-matrix-new 查看支持情况 */ H265: "hevc_nvenc" }, OMX: { /** * 使用OpenOMX加速H264编码,可能适用于嵌入式平台 * 适配容器:mp4 */ H264: "h264_omx" }, V4L2: { /** * 使用V4L2加速H264编码 * 适配容器:mp4 */ H264: "h264_v4l2m2m" }, VAAPI: { /** * 使用VAAPI加速H264编码 * 适配容器:mp4 */ H264: "h264_vaapi", /** * 使用VAAPI加速H265编码 * 适配容器:mp4 */ H265: "hevc_vaapi", /** * 使用VAAPI加速VP8编码 * 适配容器:webm */ VP8: "vp8_vaapi", /** * 使用VAAPI加速VP9编码 * 适配容器:webm */ VP9: "vp9_vaapi" }, VIDEOTOOLBOX: { /** * 使用VIDEOTOOLBOX加速H264编码,适用于MAC * 适配容器:mp4 */ H264: "h264_videotoolbox", /** * 使用VIDEOTOOLBOX加速H265编码,适用于MAC * 适配容器:mp4 */ H265: "hevc_videotoolbox" } }; /** 视频编码器映射 */ export const VIDEO_ENCODER_MAP = Object.values(VIDEO_ENCODER).reduce((map, o) => { Object.entries(o).forEach(([type, codec]) => { !map[type] && (map[type] = []); map[type].push(codec) }); return map; }, {}); export const AUDIO_ENCODER = { /** * AAC音频编码 * 建议使用此编码 */ AAC: "aac", /** * OPUS音频编码 */ OPUS: "libopus" } /** 音频编码器映射 */ export const AUDIO_ENCODER_MAP = Object.values(AUDIO_ENCODER).reduce((map, o) => { Object.entries(o).forEach(([type, codec]) => { !map[type] && (map[type] = []); map[type].push(codec) }); return map; }, {}); /** 比特流过滤器 */ export const BITSTREAM_FILTER = { H264: "h264_mp4toannexb", H265: "hevc_mp4toannexb", VP9: "vp9_superframe" }; /** 视频格式映射到支持的视频编码器 */ export const FORMAT_VIDEO_ENCODER_MAP = { "mp4": [ VIDEO_ENCODER.CPU.H264, VIDEO_ENCODER.CPU.H265, VIDEO_ENCODER.INTEL.H264, VIDEO_ENCODER.INTEL.H265, VIDEO_ENCODER.AMD.H264, VIDEO_ENCODER.AMD.H265, VIDEO_ENCODER.NVIDIA.H264, VIDEO_ENCODER.NVIDIA.H265, VIDEO_ENCODER.OMX.H264, VIDEO_ENCODER.V4L2.H264, VIDEO_ENCODER.VAAPI.H264, VIDEO_ENCODER.VAAPI.H265, VIDEO_ENCODER.VIDEOTOOLBOX.H264, VIDEO_ENCODER.VIDEOTOOLBOX.H265 ], "webm": [ VIDEO_ENCODER.CPU.VP8, VIDEO_ENCODER.CPU.VP9, VIDEO_ENCODER.INTEL.VP9, VIDEO_ENCODER.VAAPI.VP8, VIDEO_ENCODER.VAAPI.VP9 ], "ts": [ VIDEO_ENCODER.CPU.H264, VIDEO_ENCODER.CPU.H265, VIDEO_ENCODER.INTEL.H264, VIDEO_ENCODER.INTEL.H265, VIDEO_ENCODER.AMD.H264, VIDEO_ENCODER.AMD.H265, VIDEO_ENCODER.NVIDIA.H264, VIDEO_ENCODER.NVIDIA.H265, VIDEO_ENCODER.OMX.H264, VIDEO_ENCODER.V4L2.H264, VIDEO_ENCODER.VAAPI.H264, VIDEO_ENCODER.VAAPI.H265, VIDEO_ENCODER.VIDEOTOOLBOX.H264, VIDEO_ENCODER.VIDEOTOOLBOX.H265 ] }; /** 视频格式映射到支持的音频编码器 */ export const FORMAT_AUDIO_ENCODER_MAP = { "mp4": [ AUDIO_ENCODER.AAC, AUDIO_ENCODER.OPUS ], "webm": [ AUDIO_ENCODER.AAC, AUDIO_ENCODER.OPUS ] }; /** * Xfade转场滤镜 * 请参考:http://trac.ffmpeg.org/wiki/Xfade */ export const TRANSITION = { /** 淡入淡出 */ FADE: "fade", /** 从右向左擦除 */ WIPE_LEFT: "wipeleft", /** 从左向右擦除 */ WIPE_RIGHT: "wiperight", /** 从下往上擦除 */ WIPE_UP: "wipeup", /** 从上往下擦除 */ WIPE_DOWN: "wipedown", /** 从右向左滑动 */ SLIDE_LEFT: "slideleft", /** 从左向右滑动 */ SLIDE_RIGHT: "slideright", /** 从下往上滑动 */ SLIDE_UP: "slideup", /** 从上往下滑动 */ SLIDE_DOWN: "slidedown", /** 圆形裁剪过渡 */ CIRCLE_CROP: "circlecrop", /** 矩形裁剪过渡 */ RECT_CROP: "rectcrop", /** 色块过渡 */ DISTANCE: "distance", /** 黑色渐变淡入淡出 */ FADE_BLACK: "fadeblack", /** 白色渐变淡入淡出 */ FADE_WHITE: "fadewhite", /** 雷达扫描 */ RADIAL: "radial", /** 从右向左平滑过渡 */ SMOOTH_LEFT: "smoothleft", /** 从左向右平滑过渡 */ SMOOTH_RIGHT: "smoothright", /** 从下向上平滑过渡 */ SMOOTH_UP: "smoothup", /** 从上向下平滑过渡 */ SMOOTH_DOWN: "smoothdown", /** 圆形开放过渡 */ CIRCLE_OPEN: "circleopen", /** 圆形闭合过渡 */ CIRCLE_CLOSE: "circleclose", /** 垂直方向开放过渡 */ VERT_OPEN: "vertopen", /** 垂直方向闭合过渡 */ VERT_CLOSE: "vertclose", /** 水平方向开放过渡 */ HORZ_OPEN: "horzopen", /** 水平方向闭合过渡 */ HORZ_CLOSE: "horzclose", /** 溶解过渡 */ DISSOLVE: "dissolve", /** 像素化过渡 */ PIXELIZE: "pixelize", /** 右下对角线过渡 */ DIAGL: "diagtl", /** 左下对角线过渡 */ DIAGTR: "diagtr", /** 右上对角线过渡 */ DIAGBL: "diagbl", /** 左上对角线过渡 */ DIAGBR: "diagbr", /** 水平从右向左百叶窗过渡 */ SLICE_LEFT: "hlslice", /** 水平从左向右百叶窗过渡 */ SLICE_RIGHT: "hrslice", /** 垂直从右向左百叶窗过渡 */ SLICE_UP: "vuslice", /** 垂直从右向左百叶窗过渡 */ SLICE_DOWN: "vdslice", /** 高速模糊效果 */ HBLUR: "hblur", /** 灰度渐变 */ FADE_GRAYS: "fadegrays", /** 从右下向左上擦除 */ WIPE_TL: "wipetl", /** 从左下向右上角擦除 */ WIPE_TR: "wipetr", /** 从右上向左下擦除 */ WIPE_BL: "wipebl", /** 从左上向右下擦除 */ WIPE_BR: "wipebr", /** 水平挤压 */ SQUEEZEH: "squeezeh", /** 垂直挤压 */ SQUEEZEV: "squeezev", /** 放大过渡 */ ZOOM_IN: "zoomin", /** 从右向左扫过 */ WIND_LEFT: "hlwind", /** 从左向右扫过 */ WIND_RIGHT: "hrwind", /** 从下向上扫过 */ WIND_UP: "vuwind", /** 从上向下扫过 */ WIND_DOWN: "vdwind", /** 从右向左覆盖 */ COVER_LEFT: "coverleft", /** 从左向右覆盖 */ COVER_RIGHT: "coverright", /** 从下向上覆盖 */ COVER_UP: "coverup", /** 从上向下覆盖 */ COVER_DOWN: "coverdown", /** 从右向左揭开 */ REVEAL_LEFT: "revealleft", /** 从左向右揭开 */ REVEAL_RIGHT: "revealright", /** 从下向上揭开 */ REVEAL_UP: "revealup", /** 从上向下揭开 */ REVEAL_DOWN: "revealdown" };