UNPKG

canvas2video

Version:

Convert dynamic canvas to video, support merge audio

1 lines 2.94 kB
!function(e,t){if("object"==typeof exports&&"object"==typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var o=t();for(var r in o)("object"==typeof exports?exports:e)[r]=o[r]}}(window,(function(){return function(e){var t={};function o(r){if(t[r])return t[r].exports;var i=t[r]={i:r,l:!1,exports:{}};return e[r].call(i.exports,i,i.exports,o),i.l=!0,i.exports}return o.m=e,o.c=t,o.d=function(e,t,r){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},o.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},o.t=function(e,t){if(1&t&&(e=o(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(o.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var i in e)o.d(r,i,function(t){return e[t]}.bind(null,i));return r},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,"a",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p="",o(o.s=0)}([function(e,t,o){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const r={mimeType:"video/webm;codecs=h264",outVideoType:"mp4",transcodeOptions:"",concatDemuxerOptions:"-c:v copy -af apad -map 0:v -map 1:a -shortest"};t.Canvas2Video=class{constructor(e){this.config=Object.assign({},r,e)}startRecord(){const e={};e.promise=new Promise((t,o)=>{e.resolve=t,e.reject=o}),this.deferred=e;const t=this.config.canvas.captureStream(),o=new MediaRecorder(t,{mimeType:this.config.mimeType}),r=[];o.ondataavailable=function(e){e.data&&e.data.size&&r.push(e.data)},o.onstop=()=>{this.deferred.resolve(new Blob(r,{type:this.config.mimeType}))},o.start(),this.recorder=o}stopRecord(){this.recorder.stop()}async convertVideo(e){const{audio:t,outVideoType:o,mimeType:r,workerOptions:i,transcodeOptions:n,concatDemuxerOptions:s}=this.config,{createFFmpeg:a,fetchFile:c}=window.FFmpeg,p=a(i||{});await p.load();const f=r.split(";")[0].split("/")[1],u=await e.arrayBuffer();if(await p.FS("writeFile","video."+f,new Uint8Array(u)),t){const e=await c(t),r=t.split(".").pop();await p.FS("writeFile","1."+r,e);const i=s.split(/\s+/).filter(e=>e);await p.run("-i","video."+f,"-i","1."+r,...i,"out."+o)}else if(f!==o){const e=n.split(/\s+/g).filter(e=>e);await p.run("-i","video."+f,...e,"out."+o)}const d=await p.FS("readFile","out."+o),l=new Blob([d.buffer],{type:"video/"+o});return URL.createObjectURL(l)}async getStreamURL(){const e=await this.deferred.promise,{mimeType:t,audio:o,outVideoType:r}=this.config;if(t.split(";")[0].split("/")[1]===r&&!o)return URL.createObjectURL(e);if(!window.FFmpeg){const e=new Error("please load FFmpeg script file like https://unpkg.com/@ffmpeg/ffmpeg@0.7.0/dist/ffmpeg.min.js");return Promise.reject(e)}return this.convertVideo(e)}}}])}));