@tikagent/video-editor-cli 1.5.0-preview.3 → 1.5.0-preview.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/browser.js +1 -1
- package/dist/lib/processes.js +1 -1
- package/dist/lib/telemetry.js +1 -1
- package/dist/runtime/app.js +1 -1
- package/dist/runtime/cli/lib/browser.js +1 -1
- package/dist/runtime/cli/lib/processes.js +1 -1
- package/dist/runtime/cli/lib/telemetry.js +1 -1
- package/dist/runtime/export-pipeline.js +1 -1
- package/dist/runtime/optimized-export.js +1 -1
- package/dist/runtime/server.js +1 -1
- package/dist/runtime/webcodecs-export.js +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";async function webCodecsExport(e={}){if(state.exporting)return;pause(),state.exporting=!0,state.rendering=!0,renderCancelled=!1;const t=new AbortController,r=t.signal;fastExportAbort=t;let o,a,n,i,s=Promise.resolve(),
|
|
1
|
+
"use strict";async function webCodecsExport(e={}){if(state.exporting)return;pause(),state.exporting=!0,state.rendering=!0,renderCancelled=!1;const t=new AbortController,r=t.signal;fastExportAbort=t;let o,a,n,i,s=Promise.resolve(),c=0,d=0;const p=()=>{if(renderCancelled||r.aborted)throw new Error("cancelled");if(i)throw i},l=async(e,t)=>{p();const o=await fetch(e,{method:"POST",body:t instanceof Blob?t:void 0===t?void 0:JSON.stringify(t),signal:r}),a=await o.json();if(!o.ok||a.error)throw new Error(a.error||"export request failed");return a};els.exportOverlay.classList.remove("hidden");const f=(t,r)=>"function"==typeof trackExportWait?trackExportWait(e.requestId,t,r):r();let w=0;try{const t=performance.now(),u=exportWindow(e);if("function"!=typeof VideoEncoder)throw new Error("WebCodecs VideoEncoder is unavailable");const h=e.bitrate??Math.max(1e5,Math.min(2e8,Math.round(project.width*project.height*u.fps*.15)));if(!Number.isSafeInteger(h)||h<1e5||h>2e8)throw new Error("bitrate must be between 100000 and 200000000 bits/s");const m=e.bitrateMode||"variable";if(!["variable","constant"].includes(m))throw new Error("bitrateMode must be variable or constant");let b;for(const e of["avc1.640034","avc1.640033","avc1.420028"]){const t={codec:e,width:project.width,height:project.height,bitrate:h,bitrateMode:m,framerate:u.fps,avc:{format:"annexb"},latencyMode:"quality"};if((await VideoEncoder.isConfigSupported(t).catch(()=>({}))).supported){b=t;break}}if(!b)throw new Error("H.264 WebCodecs encoding is unsupported at this resolution");exportDecodeBegin(r,e.decode,e.requestId);const x=await f("audio-mix",()=>renderExportAudio(u.start,u.dur,r)),g=await l(projectApi("/api/export/begin"),exportBeginOptions(e,u,x,"webcodecs"));a=g.id,x&&await l("/api/export/audio?id="+a,x),n=new BatchFrameUploader((e,t)=>l(`/api/export/frame?id=${a}&frames=${t}`,e)),o=new VideoEncoder({output:e=>{if(r.aborted||i)return;const t=new Uint8Array(e.byteLength);e.copyTo(t),c++,d+=t.length,s=s.then(()=>n.push(new Blob([t]))).catch(e=>{i||=e}).finally(()=>{c--,d-=t.length})},error:e=>{i||=e}}),o.configure(b),await loadLibraryFonts(),await document.fonts.ready;const y=performance.now();for(let e=0;e<u.frames;e++){p(),await f("encoder",async()=>{const e=performance.now()+3e4;for(;o.encodeQueueSize>4||c>=8||d>33554432;){if(p(),performance.now()>e)throw new Error("WebCodecs encoder stalled");await new Promise(e=>setTimeout(e,10))}});const t=u.start+e/u.fps;state.time=t,await f("video-seek",()=>seekVideosTo(t)),await f("frame-assets",()=>prepareFrameAssets(t)),drawFrame(t);const r=new VideoFrame(els.preview,{timestamp:Math.round(1e6*e/u.fps),duration:Math.round(1e6*(e+1)/u.fps)-Math.round(1e6*e/u.fps)});try{o.encode(r,{keyFrame:e%Math.max(1,Math.round(2*u.fps))===0})}finally{r.close()}w=e+1;const a=(e+1)/u.frames*100;els.exportProgress.style.width=a.toFixed(1)+"%",els.exportTitle.textContent=uiText("Rendering… {percent}%",{percent:a.toFixed(0)})}const E=performance.now()-y;await f("encoder",()=>waitExportTask(o.flush(),r,3e4,"VideoEncoder flush")),await s,p(),await n.finish();const v=await l("/api/export/end?id="+a,{metrics:{engine:"webcodecs",frames:u.frames,totalMs:performance.now()-t,phases:{renderMs:E},codec:b.codec,bitrate:h,bitrateMode:m,decode:e.decode||"auto"}});if(a=null,!e.requestId){const e=document.createElement("a");e.href=v.src,e.download=decodeURIComponent(v.src.split("/").pop()),e.click()}}catch(t){const o=r.aborted||renderCancelled?"cancelled":t.message;if(e.requestId){let r;try{r=project.clips.filter(e=>activeAt(e,state.time)).map(e=>e.id).slice(0,12)}catch{}await fetch(projectApi("/api/export/report"),{method:"POST",body:JSON.stringify({requestId:e.requestId,group:e.group||0,error:o,stack:t.stack,timeSec:state.time,frame:w,browserGpu:runtime.browserGpu,clipIds:r})}).catch(()=>{})}else"cancelled"!==o&&alert(uiText("Export failed: ")+o)}finally{t.abort(),n?.cancel(),o&&"closed"!==o.state&&o.close(),await s,a&&await fetch(`/api/export/end?id=${a}&discard=1`,{method:"POST"}).catch(()=>{}),exportDecodeEnd(),fastExportAbort=null,state.exporting=!1,state.rendering=!1,els.exportOverlay.classList.add("hidden"),runtime.pendingSync&&syncFromServer()}}
|
package/package.json
CHANGED