@codingfactory/mediables-vue 2.8.0 → 2.9.1

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.
Files changed (53) hide show
  1. package/dist/PixiFrameExporter-DGTn9-uZ.cjs +2 -0
  2. package/dist/{PixiFrameExporter-CqKXaoCX.cjs.map → PixiFrameExporter-DGTn9-uZ.cjs.map} +1 -1
  3. package/dist/{PixiFrameExporter-BcywK0MP.js → PixiFrameExporter-qCsqARff.js} +60 -59
  4. package/dist/{PixiFrameExporter-BcywK0MP.js.map → PixiFrameExporter-qCsqARff.js.map} +1 -1
  5. package/dist/components/video/ui-v2/AssetRail.vue.d.ts +2 -0
  6. package/dist/components/video/ui-v2/AssetRailItem.vue.d.ts +7 -0
  7. package/dist/components/video/ui-v2/AudioMixerPanel.vue.d.ts +33 -0
  8. package/dist/components/video/ui-v2/CaptionSrtPanel.vue.d.ts +9 -0
  9. package/dist/components/video/ui-v2/DesktopInspectorSections.vue.d.ts +21 -0
  10. package/dist/components/video/ui-v2/DraftRecoveryBanner.vue.d.ts +12 -0
  11. package/dist/components/video/ui-v2/KeyframePresetPanel.vue.d.ts +26 -0
  12. package/dist/components/video/ui-v2/MobileClipSummary.vue.d.ts +4 -0
  13. package/dist/components/video/ui-v2/MobileToolPicker.vue.d.ts +3 -0
  14. package/dist/components/video/ui-v2/SplitPanelLayout.vue.d.ts +9 -5
  15. package/dist/components/video/ui-v2/TimelineTrackHeader.vue.d.ts +2 -0
  16. package/dist/composables/useClientVideoExport.d.ts +27 -0
  17. package/dist/composables/useLiveStream.d.ts +2 -2
  18. package/dist/composables/useRadialMenu.d.ts +1 -1
  19. package/dist/composables/useVideoEditor.d.ts +119 -7
  20. package/dist/composables/useVideoFilters.d.ts +4 -4
  21. package/dist/index-B8iY-eYF.js +33011 -0
  22. package/dist/index-B8iY-eYF.js.map +1 -0
  23. package/dist/index-EmUdY4EL.cjs +350 -0
  24. package/dist/index-EmUdY4EL.cjs.map +1 -0
  25. package/dist/mediables-vue.cjs +1 -1
  26. package/dist/mediables-vue.mjs +1 -1
  27. package/dist/render-page/assets/{index-y90zwXpc.js → index-jZGmiMRr.js} +991 -151
  28. package/dist/render-page/index.html +1 -1
  29. package/dist/services/VideoJobClient.d.ts +1 -1
  30. package/dist/style.css +1 -1
  31. package/dist/types/api.d.ts +14 -0
  32. package/dist/types/video.d.ts +164 -5
  33. package/dist/video/project/audioMixerSchema.d.ts +152 -0
  34. package/dist/video/project/captionSrt.d.ts +23 -0
  35. package/dist/video/project/draftRecovery.d.ts +86 -0
  36. package/dist/video/project/exportPresets.d.ts +172 -0
  37. package/dist/video/project/index.d.ts +22 -0
  38. package/dist/video/project/keyframeAutomation.d.ts +91 -0
  39. package/dist/video/project/mediaSourceAnalysis.d.ts +127 -0
  40. package/dist/video/project/mediaSourceCache.d.ts +47 -0
  41. package/dist/video/project/recipeMigration.d.ts +26 -0
  42. package/dist/video/project/timelineSelection.d.ts +23 -0
  43. package/dist/video/project/timelineTransactions.d.ts +129 -0
  44. package/dist/video/project/visualLayerSchema.d.ts +238 -0
  45. package/dist/video-engine/adapters/AudioManager.d.ts +9 -0
  46. package/dist/video-engine/adapters/MediablesCompositionAdapter.d.ts +3 -0
  47. package/dist/video-engine/adapters/TextOverlayManager.d.ts +4 -2
  48. package/package.json +1 -1
  49. package/dist/PixiFrameExporter-CqKXaoCX.cjs +0 -2
  50. package/dist/index-DNo3Kr1t.cjs +0 -342
  51. package/dist/index-DNo3Kr1t.cjs.map +0 -1
  52. package/dist/index-DpkdpuMs.js +0 -29327
  53. package/dist/index-DpkdpuMs.js.map +0 -1
@@ -0,0 +1,238 @@
1
+ export type VisualLayerType = 'text' | 'caption' | 'shape' | 'image' | 'sticker' | 'svg' | 'adjustment';
2
+ export type BlendMode = 'normal' | 'multiply' | 'screen' | 'overlay' | 'darken' | 'lighten' | 'color-dodge' | 'color-burn' | 'hard-light' | 'soft-light' | 'difference' | 'exclusion';
3
+ export type TextAlign = 'left' | 'center' | 'right' | 'justify';
4
+ export type VerticalAlign = 'top' | 'middle' | 'bottom';
5
+ export type TextWrapMode = 'auto' | 'none' | 'manual';
6
+ export type CaptionSource = 'manual' | 'srt-import' | 'transcription';
7
+ export type CaptionStylePreset = 'default' | 'subtitle' | 'karaoke' | 'boxed' | 'minimal';
8
+ export type CaptionAnimationPreset = 'none' | 'fade' | 'pop' | 'word-highlight';
9
+ export type TransitionType = 'cut' | 'fade' | 'crossfade' | 'dip-to-black' | 'wipe-left' | 'wipe-right' | 'slide-left' | 'slide-right' | 'zoom';
10
+ export type EasingType = 'linear' | 'ease-in' | 'ease-out' | 'ease-in-out';
11
+ export type KeyframeEasing = EasingType | 'hold' | 'step';
12
+ export type KeyframeTargetProperty = 'transform.position.x' | 'transform.position.y' | 'transform.scale.x' | 'transform.scale.y' | 'transform.rotation' | 'opacity' | 'text.style.fontSize' | 'text.style.colorAlpha' | 'adjustment.intensity';
13
+ export type SchemaValidationErrorCode = 'empty-id' | 'empty-track-id' | 'invalid-time' | 'invalid-duration' | 'invalid-opacity' | 'invalid-transform' | 'invalid-caption-segment' | 'invalid-transition-boundary' | 'transition-overlap' | 'invalid-keyframe';
14
+ export declare class VisualLayerSchemaError extends Error {
15
+ readonly code: SchemaValidationErrorCode;
16
+ constructor(code: SchemaValidationErrorCode, message: string);
17
+ }
18
+ export interface LayerPoint {
19
+ x: number;
20
+ y: number;
21
+ }
22
+ export interface LayerTransform {
23
+ position: LayerPoint;
24
+ anchor: LayerPoint;
25
+ scale: LayerPoint;
26
+ rotation: number;
27
+ }
28
+ export interface MobileVisualCapabilityFlags {
29
+ canPreview: boolean;
30
+ canEdit: boolean;
31
+ canExport: boolean;
32
+ supportsKeyframeEditor: boolean;
33
+ supportsTransitionEditor: boolean;
34
+ }
35
+ export interface VisualFeatureCapabilityMatrix {
36
+ visualLayers: {
37
+ supportedTypes: VisualLayerType[];
38
+ maxLayerCount: number;
39
+ mobile: MobileVisualCapabilityFlags;
40
+ };
41
+ captions: {
42
+ supportsManualTracks: boolean;
43
+ supportsSrtImport: boolean;
44
+ supportsTranscription: boolean;
45
+ supportsWordTiming: boolean;
46
+ mobile: MobileVisualCapabilityFlags;
47
+ };
48
+ transitions: {
49
+ supportedTypes: TransitionType[];
50
+ mobile: MobileVisualCapabilityFlags;
51
+ };
52
+ keyframes: {
53
+ supportedProperties: KeyframeTargetProperty[];
54
+ mobile: MobileVisualCapabilityFlags;
55
+ };
56
+ }
57
+ export interface RichTextStyle {
58
+ fontFamily: string;
59
+ fontSize: number;
60
+ fontWeight: number;
61
+ fontStyle: 'normal' | 'italic';
62
+ color: string;
63
+ backgroundColor: string;
64
+ backgroundOpacity: number;
65
+ strokeColor: string;
66
+ strokeWidth: number;
67
+ shadowColor: string;
68
+ shadowBlur: number;
69
+ shadowOffsetX: number;
70
+ shadowOffsetY: number;
71
+ lineHeight: number;
72
+ letterSpacing: number;
73
+ textAlign: TextAlign;
74
+ verticalAlign: VerticalAlign;
75
+ }
76
+ export interface VisualLayerKeyframe {
77
+ id: string;
78
+ property: KeyframeTargetProperty;
79
+ time: number;
80
+ value: number;
81
+ easing: KeyframeEasing;
82
+ }
83
+ export interface BaseVisualLayerRecipe {
84
+ id: string;
85
+ type: VisualLayerType;
86
+ trackId: string;
87
+ startTime: number;
88
+ duration: number;
89
+ zIndex: number;
90
+ enabled: boolean;
91
+ blendMode: BlendMode;
92
+ opacity: number;
93
+ transform: LayerTransform;
94
+ capabilities?: MobileVisualCapabilityFlags;
95
+ keyframes?: VisualLayerKeyframe[];
96
+ }
97
+ export interface TextLayerRecipe extends BaseVisualLayerRecipe {
98
+ type: 'text';
99
+ text: {
100
+ content: string;
101
+ style: RichTextStyle;
102
+ wrap: TextWrapMode;
103
+ maxWidth?: number;
104
+ };
105
+ animation?: {
106
+ preset: 'none' | 'fade' | 'slide' | 'scale' | 'typewriter';
107
+ duration: number;
108
+ easing: EasingType;
109
+ };
110
+ }
111
+ export interface CaptionLayerRecipe extends BaseVisualLayerRecipe {
112
+ type: 'caption';
113
+ captionTrackId: string;
114
+ segmentIds?: string[];
115
+ }
116
+ export interface ShapeLayerRecipe extends BaseVisualLayerRecipe {
117
+ type: 'shape';
118
+ shape: {
119
+ kind: 'rectangle' | 'ellipse' | 'line';
120
+ fillColor: string;
121
+ strokeColor?: string;
122
+ strokeWidth?: number;
123
+ cornerRadius?: number;
124
+ };
125
+ }
126
+ export interface ImageLayerRecipe extends BaseVisualLayerRecipe {
127
+ type: 'image';
128
+ sourceRefId: string;
129
+ fit: 'contain' | 'cover' | 'stretch';
130
+ }
131
+ export interface StickerLayerRecipe extends BaseVisualLayerRecipe {
132
+ type: 'sticker';
133
+ sourceRefId: string;
134
+ label?: string;
135
+ }
136
+ export interface SvgLayerRecipe extends BaseVisualLayerRecipe {
137
+ type: 'svg';
138
+ sourceRefId?: string;
139
+ sanitizedMarkup?: string;
140
+ viewBox?: string;
141
+ }
142
+ export interface AdjustmentLayerRecipe extends BaseVisualLayerRecipe {
143
+ type: 'adjustment';
144
+ adjustment: {
145
+ kind: 'color' | 'blur' | 'vignette' | 'lut';
146
+ intensity: number;
147
+ };
148
+ }
149
+ export type VisualLayerRecipe = TextLayerRecipe | CaptionLayerRecipe | ShapeLayerRecipe | ImageLayerRecipe | StickerLayerRecipe | SvgLayerRecipe | AdjustmentLayerRecipe;
150
+ export interface CaptionWordRecipe {
151
+ id: string;
152
+ startTime: number;
153
+ endTime: number;
154
+ text: string;
155
+ }
156
+ export interface CaptionSegmentRecipe {
157
+ id: string;
158
+ startTime: number;
159
+ endTime: number;
160
+ text: string;
161
+ words?: CaptionWordRecipe[];
162
+ }
163
+ export interface CaptionTrackRecipe {
164
+ id: string;
165
+ source: CaptionSource;
166
+ language?: string;
167
+ stylePreset: CaptionStylePreset;
168
+ animation: CaptionAnimationPreset;
169
+ segments: CaptionSegmentRecipe[];
170
+ }
171
+ export interface TransitionParams {
172
+ direction?: 'left' | 'right' | 'up' | 'down';
173
+ color?: string;
174
+ softness?: number;
175
+ }
176
+ export interface TransitionRecipe {
177
+ id: string;
178
+ type: TransitionType;
179
+ fromClipId: string;
180
+ toClipId: string;
181
+ duration: number;
182
+ easing: EasingType;
183
+ cutTime?: number;
184
+ params?: TransitionParams;
185
+ }
186
+ export interface TransitionClipBoundary {
187
+ id: string;
188
+ timelineStart: number;
189
+ timelineEnd: number;
190
+ }
191
+ export interface NormalizedTransitionWindow {
192
+ transition: TransitionRecipe & {
193
+ cutTime: number;
194
+ };
195
+ fromWindow: {
196
+ clipId: string;
197
+ startTime: number;
198
+ endTime: number;
199
+ };
200
+ toWindow: {
201
+ clipId: string;
202
+ startTime: number;
203
+ endTime: number;
204
+ };
205
+ }
206
+ export type VisualLayerDefaultKey = 'zIndex' | 'enabled' | 'blendMode' | 'opacity' | 'transform' | 'capabilities' | 'keyframes';
207
+ export type TextLayerInput = Omit<TextLayerRecipe, VisualLayerDefaultKey | 'text'> & Partial<Pick<BaseVisualLayerRecipe, VisualLayerDefaultKey>> & {
208
+ text: {
209
+ content: string;
210
+ style?: Partial<RichTextStyle>;
211
+ wrap?: TextWrapMode;
212
+ maxWidth?: number;
213
+ };
214
+ };
215
+ export type CaptionLayerInput = Omit<CaptionLayerRecipe, VisualLayerDefaultKey> & Partial<Pick<BaseVisualLayerRecipe, VisualLayerDefaultKey>>;
216
+ export type ShapeLayerInput = Omit<ShapeLayerRecipe, VisualLayerDefaultKey> & Partial<Pick<BaseVisualLayerRecipe, VisualLayerDefaultKey>>;
217
+ export type ImageLayerInput = Omit<ImageLayerRecipe, VisualLayerDefaultKey> & Partial<Pick<BaseVisualLayerRecipe, VisualLayerDefaultKey>>;
218
+ export type StickerLayerInput = Omit<StickerLayerRecipe, VisualLayerDefaultKey> & Partial<Pick<BaseVisualLayerRecipe, VisualLayerDefaultKey>>;
219
+ export type SvgLayerInput = Omit<SvgLayerRecipe, VisualLayerDefaultKey> & Partial<Pick<BaseVisualLayerRecipe, VisualLayerDefaultKey>>;
220
+ export type AdjustmentLayerInput = Omit<AdjustmentLayerRecipe, VisualLayerDefaultKey> & Partial<Pick<BaseVisualLayerRecipe, VisualLayerDefaultKey>>;
221
+ export type VisualLayerInput = TextLayerInput | CaptionLayerInput | ShapeLayerInput | ImageLayerInput | StickerLayerInput | SvgLayerInput | AdjustmentLayerInput;
222
+ export interface CaptionTrackInput {
223
+ id: string;
224
+ source: CaptionSource;
225
+ language?: string;
226
+ stylePreset?: CaptionStylePreset;
227
+ animation?: CaptionAnimationPreset;
228
+ segments: CaptionSegmentRecipe[];
229
+ }
230
+ export declare const DEFAULT_LAYER_TRANSFORM: LayerTransform;
231
+ export declare const DEFAULT_RICH_TEXT_STYLE: RichTextStyle;
232
+ export declare const DEFAULT_MOBILE_VISUAL_CAPABILITIES: MobileVisualCapabilityFlags;
233
+ export declare const DEFAULT_VISUAL_FEATURE_CAPABILITIES: VisualFeatureCapabilityMatrix;
234
+ export declare function normalizeVisualLayer(layer: VisualLayerInput): VisualLayerRecipe;
235
+ export declare function normalizeCaptionTrack(track: CaptionTrackInput): CaptionTrackRecipe;
236
+ export declare function normalizeLayerKeyframes(keyframes: VisualLayerKeyframe[]): VisualLayerKeyframe[];
237
+ export declare function normalizeTransitionWindow(transition: TransitionRecipe, fromClip: TransitionClipBoundary, toClip: TransitionClipBoundary): NormalizedTransitionWindow;
238
+ export declare function validateTransitionWindowsDoNotOverlap(windows: NormalizedTransitionWindow[]): void;
@@ -39,6 +39,10 @@ export declare class AudioManager {
39
39
  * Add an audio track to the composition
40
40
  */
41
41
  addAudioTrack(config: AudioTrackConfig): Promise<string>;
42
+ private resolveAudioSource;
43
+ private createAudioClipConfig;
44
+ private findAudioTrack;
45
+ private removeClipFromTrack;
42
46
  /**
43
47
  * Create volume keyframes for fade effects
44
48
  */
@@ -47,6 +51,10 @@ export declare class AudioManager {
47
51
  * Update audio track volume
48
52
  */
49
53
  updateVolume(id: string, volume: number): Promise<void>;
54
+ /**
55
+ * Update an audio track's source, timing, fades, loop flag, or name.
56
+ */
57
+ updateAudioTrack(id: string, config: Partial<AudioTrackConfig>): Promise<void>;
50
58
  /**
51
59
  * Apply fade in effect to an audio track
52
60
  */
@@ -67,6 +75,7 @@ export declare class AudioManager {
67
75
  * Set master volume (affects all tracks)
68
76
  */
69
77
  setMasterVolume(volume: number): void;
78
+ private resolveLayerVolume;
70
79
  /**
71
80
  * Get master volume
72
81
  */
@@ -24,6 +24,9 @@ export declare class MediablesCompositionAdapter {
24
24
  attachPlayer(element: HTMLDivElement): Promise<void>;
25
25
  private setupResponsiveScaling;
26
26
  loadFromRecipe(recipe: VideoRecipe): Promise<void>;
27
+ private applyTransitionsToClips;
28
+ private mapTransitionType;
29
+ private mapTransitionEasing;
27
30
  private addTimelineClip;
28
31
  private addTextOverlay;
29
32
  private applyFiltersToClip;
@@ -38,6 +38,7 @@ export interface TextOverlayConfig {
38
38
  export declare class TextOverlayManager {
39
39
  private composition;
40
40
  private textClips;
41
+ private overlayConfigs;
41
42
  private fonts;
42
43
  private nextId;
43
44
  constructor(composition: Composition);
@@ -54,6 +55,8 @@ export declare class TextOverlayManager {
54
55
  * Add a text overlay to the composition
55
56
  */
56
57
  addTextOverlay(config: TextOverlayConfig): Promise<string>;
58
+ private buildTextClipConfig;
59
+ private applyPosition;
57
60
  /**
58
61
  * Apply animation to text clip configuration
59
62
  */
@@ -84,8 +87,7 @@ export declare class TextOverlayManager {
84
87
  /**
85
88
  * Create animated captions from transcript
86
89
  */
87
- addCaptions(transcript: any, // Would be core.Transcript type
88
- preset?: 'classic' | 'cascade' | 'guinea' | 'solar' | 'spotlight' | 'whisper', position?: {
90
+ addCaptions(transcript: core.Transcript, preset?: 'classic' | 'cascade' | 'guinea' | 'solar' | 'spotlight' | 'whisper', position?: {
89
91
  x?: string | number;
90
92
  y?: string | number;
91
93
  }): Promise<void>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@codingfactory/mediables-vue",
3
- "version": "2.8.0",
3
+ "version": "2.9.1",
4
4
  "publishConfig": {
5
5
  "access": "restricted"
6
6
  },
@@ -1,2 +0,0 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const R=require("./index-DNo3Kr1t.cjs");function V(){return typeof VideoEncoder<"u"&&typeof VideoFrame<"u"}function z(){return typeof AudioEncoder<"u"&&typeof AudioData<"u"}async function L(i,d){try{const t=await fetch(i,d?{signal:d}:{});if(!t.ok)return null;const r=await t.arrayBuffer(),u=new AudioContext;try{return await u.decodeAudioData(r)}catch{return null}finally{await u.close()}}catch{return null}}function N(i,d,a){const t=i.sampleRate,r=Math.max(0,Math.floor(d*t)),u=Math.min(i.length,Math.ceil(a*t)),p=Math.max(0,u-r),n=[];for(let s=0;s<i.numberOfChannels;s++){const l=i.getChannelData(s);n.push(l.slice(r,r+p))}return{channels:n,sampleRate:t,numberOfChannels:i.numberOfChannels}}async function P(i,d,a,t,r){const u={codec:"mp4a.40.2",numberOfChannels:t,sampleRate:a,bitrate:r};if(!(await AudioEncoder.isConfigSupported(u)).supported)return;const n=new AudioEncoder({output:(e,c)=>{i.addAudioChunk(e,c)},error:e=>{}});n.configure(u);const s=1024,l=d[0].length;for(let e=0;e<l;e+=s){const c=Math.min(s,l-e),h=new Float32Array(t*c);for(let f=0;f<t;f++)h.set(d[f].subarray(e,e+c),f*c);const w=new AudioData({format:"f32-planar",sampleRate:a,numberOfFrames:c,numberOfChannels:t,timestamp:Math.floor(e/a*1e6),data:h});n.encode(w),w.close(),n.encodeQueueSize>10&&await new Promise(f=>{n.addEventListener("dequeue",()=>f(),{once:!0})})}await n.flush(),n.close()}async function X(i,d){const{width:a,height:t,fps:r,bitrate:u=5e6,audioBitrate:p=128e3,trimStart:n=0,trimEnd:s,sourceUrl:l,onProgress:e,signal:c}=d;if(!V())throw new Error("WebCodecs API is not supported in this browser");const h=i.duration.value,w=3600,f=w*60;if(!Number.isFinite(h)||h<=0)throw new Error(`Invalid video duration: ${h}. The video metadata may not have loaded. Please ensure the video is fully loaded before exporting.`);const A=s??h,E=Math.max(0,A-n);if(!Number.isFinite(E)||E<=0)throw new Error(`Invalid export duration: ${E} (trimStart=${n}, trimEnd=${A}). Check that the trim points are valid.`);if(E>w)throw new Error(`Export duration (${Math.round(E)}s) exceeds maximum allowed (${w}s).`);const g=Math.min(Math.max(1,Math.ceil(E*r)),f);let F=Promise.resolve(null);l&&z()&&(F=L(l,c));const v=await F,D=!!v&&v.numberOfChannels>0&&v.length>0,O={target:new R.ArrayBufferTarget,video:{codec:"avc",width:a,height:t,frameRate:r},fastStart:"in-memory"};D&&(O.audio={codec:"aac",numberOfChannels:v.numberOfChannels,sampleRate:v.sampleRate});const C=new R.Muxer(O),$=[{codec:"avc1.640028",hw:"prefer-hardware"},{codec:"avc1.4d0028",hw:"prefer-hardware"},{codec:"avc1.420028",hw:"prefer-hardware"},{codec:"avc1.640028",hw:"prefer-software"},{codec:"avc1.4d0028",hw:"prefer-software"},{codec:"avc1.420028",hw:"prefer-software"}];let y=null;for(const o of $){const x={codec:o.codec,width:a,height:t,bitrate:u,framerate:r,hardwareAcceleration:o.hw};if((await VideoEncoder.isConfigSupported(x)).supported){y=x;break}}if(!y)throw new Error(`No supported VideoEncoder codec found for ${a}×${t}. Try a lower export resolution or use a browser with H.264 encoding support (Chrome 94+).`);const m=new VideoEncoder({output:(o,x)=>{C.addVideoChunk(o,x)},error:o=>{}});m.configure(y);const b=document.createElement("canvas");b.width=a,b.height=t;const M=b.getContext("2d");if(!M)throw new Error("Failed to create 2D context for export target canvas");for(let o=0;o<g;o++){if(c!=null&&c.aborted)throw m.close(),new DOMException("Export aborted","AbortError");const x=n+o/r,S=await i.captureFrameAt(x);if(!S)continue;M.clearRect(0,0,a,t),M.drawImage(S,0,0,a,t);const I=Math.floor(o/r*1e6),q=Math.floor(1e6/r),T=new VideoFrame(b,{timestamp:I,duration:q}),B=o%(r*2)===0;m.encode(T,{keyFrame:B}),T.close(),m.encodeQueueSize>5&&await new Promise(_=>{m.addEventListener("dequeue",()=>_(),{once:!0})});const W=Math.round((o+1)/g*90);e==null||e(W)}if(await m.flush(),m.close(),D){e==null||e(91);const o=N(v,n,A);await P(C,o.channels,o.sampleRate,o.numberOfChannels,p),e==null||e(99)}C.finalize();const{buffer:k}=C.target;return e==null||e(100),new Blob([k],{type:"video/mp4"})}exports.exportWithPixiFrames=X;exports.isWebCodecsSupported=V;
2
- //# sourceMappingURL=PixiFrameExporter-CqKXaoCX.cjs.map