@pixerate/editor 0.115.0 → 0.116.0
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/THIRD_PARTY_NOTICES.md +3 -0
- package/dist/animation-editor/index.cjs +54 -54
- package/dist/animation-editor/index.d.cts +2 -2
- package/dist/animation-editor/index.d.ts +2 -2
- package/dist/animation-editor/index.js +2 -2
- package/dist/{chunk-DFQEX3AM.cjs → chunk-2UT4GXYA.cjs} +133 -8
- package/dist/chunk-2UT4GXYA.cjs.map +1 -0
- package/dist/{chunk-VXR7XWMF.js → chunk-7LNZAWSJ.js} +437 -41
- package/dist/chunk-7LNZAWSJ.js.map +1 -0
- package/dist/{chunk-LKCYANMW.js → chunk-ARQ7PQ6Q.js} +129 -4
- package/dist/chunk-ARQ7PQ6Q.js.map +1 -0
- package/dist/chunk-COAMRKVI.cjs +159 -0
- package/dist/chunk-COAMRKVI.cjs.map +1 -0
- package/dist/{chunk-C6C5PDKU.js → chunk-D53KSJUV.js} +3 -322
- package/dist/chunk-D53KSJUV.js.map +1 -0
- package/dist/chunk-D53VQGEJ.js +3262 -0
- package/dist/chunk-D53VQGEJ.js.map +1 -0
- package/dist/chunk-EJVDBITD.cjs +501 -0
- package/dist/chunk-EJVDBITD.cjs.map +1 -0
- package/dist/{chunk-LPLCWZTM.cjs → chunk-FODKPD44.cjs} +555 -159
- package/dist/chunk-FODKPD44.cjs.map +1 -0
- package/dist/chunk-HOCPSFGA.cjs +3262 -0
- package/dist/chunk-HOCPSFGA.cjs.map +1 -0
- package/dist/chunk-IPFRWILU.js +1908 -0
- package/dist/chunk-IPFRWILU.js.map +1 -0
- package/dist/{chunk-FV5AXTSF.cjs → chunk-JSSBHMMU.cjs} +36 -188
- package/dist/chunk-JSSBHMMU.cjs.map +1 -0
- package/dist/chunk-LF4WOZXZ.js +159 -0
- package/dist/chunk-LF4WOZXZ.js.map +1 -0
- package/dist/{chunk-26PGXHY7.cjs → chunk-M7O4BJRH.cjs} +36 -36
- package/dist/{chunk-26PGXHY7.cjs.map → chunk-M7O4BJRH.cjs.map} +1 -1
- package/dist/chunk-N3467VD6.js +501 -0
- package/dist/chunk-N3467VD6.js.map +1 -0
- package/dist/{chunk-ST7E3NEE.cjs → chunk-PAOWHJ5O.cjs} +18 -337
- package/dist/chunk-PAOWHJ5O.cjs.map +1 -0
- package/dist/{chunk-XICA4PVO.js → chunk-SEBYNBHW.js} +10 -10
- package/dist/chunk-SMJGE7HM.cjs +1908 -0
- package/dist/chunk-SMJGE7HM.cjs.map +1 -0
- package/dist/{chunk-MMVHBKMM.js → chunk-T2P5TIZ6.js} +2 -2
- package/dist/{chunk-FGW5OWJ4.js → chunk-VJUML33I.js} +4 -156
- package/dist/chunk-VJUML33I.js.map +1 -0
- package/dist/{chunk-I7FQBWMQ.cjs → chunk-ZYZGEILO.cjs} +239 -239
- package/dist/{chunk-I7FQBWMQ.cjs.map → chunk-ZYZGEILO.cjs.map} +1 -1
- package/dist/export/index.cjs +4 -2
- package/dist/export/index.cjs.map +1 -1
- package/dist/export/index.js +5 -3
- package/dist/{export-BJE8T0YA.d.cts → export-BXxSGBCq.d.cts} +2 -2
- package/dist/{export-Con3UKkm.d.ts → export-Dm44YUvS.d.ts} +2 -2
- package/dist/export-Dv0-ZVrV.d.cts +501 -0
- package/dist/export-Dv0-ZVrV.d.ts +501 -0
- package/dist/{retouch-Do6tBs2H.d.ts → flow-BMtHAmg4.d.ts} +561 -2
- package/dist/{retouch-Bxkuc0KH.d.cts → flow-COCB42TP.d.cts} +561 -2
- package/dist/image-editor/index.cjs +957 -795
- package/dist/image-editor/index.cjs.map +1 -1
- package/dist/image-editor/index.d.cts +6 -6
- package/dist/image-editor/index.d.ts +6 -6
- package/dist/image-editor/index.js +180 -18
- package/dist/image-editor/index.js.map +1 -1
- package/dist/index.cjs +4 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +5 -3
- package/dist/index.js.map +1 -1
- package/dist/kernel-wasm-WYCGNZR4.js +10 -0
- package/dist/kernel-wasm-WYCGNZR4.js.map +1 -0
- package/dist/kernel-wasm-YPVAEMVN.cjs +10 -0
- package/dist/kernel-wasm-YPVAEMVN.cjs.map +1 -0
- package/dist/paint/index.cjs +165 -3
- package/dist/paint/index.cjs.map +1 -1
- package/dist/paint/index.d.cts +225 -3
- package/dist/paint/index.d.ts +225 -3
- package/dist/paint/index.js +166 -4
- package/dist/paint-editor/index.cjs +4690 -845
- package/dist/paint-editor/index.cjs.map +1 -1
- package/dist/paint-editor/index.d.cts +1525 -277
- package/dist/paint-editor/index.d.ts +1525 -277
- package/dist/paint-editor/index.js +4560 -715
- package/dist/paint-editor/index.js.map +1 -1
- package/dist/raster/index.cjs +4 -3
- package/dist/raster/index.cjs.map +1 -1
- package/dist/raster/index.js +10 -9
- package/dist/{svg-BnRj0q8i.d.cts → svg-CVdFc80-.d.cts} +2 -2
- package/dist/{svg-CmmBFfGT.d.ts → svg-DlEuhwoX.d.ts} +2 -2
- package/dist/{types-1SUQKDAw.d.ts → types-CDLGhAZp.d.ts} +40 -2
- package/dist/{types-yINF17Ta.d.cts → types-Tfly4Aya.d.cts} +40 -2
- package/dist/vector/index.cjs +1897 -975
- package/dist/vector/index.cjs.map +1 -1
- package/dist/vector/index.d.cts +292 -32
- package/dist/vector/index.d.ts +292 -32
- package/dist/vector/index.js +928 -6
- package/dist/vector/index.js.map +1 -1
- package/dist/video-editor/index.cjs +502 -2165
- package/dist/video-editor/index.cjs.map +1 -1
- package/dist/video-editor/index.d.cts +3 -501
- package/dist/video-editor/index.d.ts +3 -501
- package/dist/video-editor/index.js +151 -1814
- package/dist/video-editor/index.js.map +1 -1
- package/package.json +1 -1
- package/skills/pixerate-image-editor/references/photoshop-files.md +7 -3
- package/skills/pixerate-vector/SKILL.md +3 -0
- package/dist/chunk-C6C5PDKU.js.map +0 -1
- package/dist/chunk-DFQEX3AM.cjs.map +0 -1
- package/dist/chunk-FGW5OWJ4.js.map +0 -1
- package/dist/chunk-FV5AXTSF.cjs.map +0 -1
- package/dist/chunk-GX332W2C.js +0 -181
- package/dist/chunk-GX332W2C.js.map +0 -1
- package/dist/chunk-LKCYANMW.js.map +0 -1
- package/dist/chunk-LPLCWZTM.cjs.map +0 -1
- package/dist/chunk-MUUXNRU4.cjs +0 -181
- package/dist/chunk-MUUXNRU4.cjs.map +0 -1
- package/dist/chunk-ST7E3NEE.cjs.map +0 -1
- package/dist/chunk-TCKIXI46.cjs +0 -1136
- package/dist/chunk-TCKIXI46.cjs.map +0 -1
- package/dist/chunk-UBIXVXPR.js +0 -1136
- package/dist/chunk-UBIXVXPR.js.map +0 -1
- package/dist/chunk-VXR7XWMF.js.map +0 -1
- /package/dist/{chunk-XICA4PVO.js.map → chunk-SEBYNBHW.js.map} +0 -0
- /package/dist/{chunk-MMVHBKMM.js.map → chunk-T2P5TIZ6.js.map} +0 -0
package/dist/export/index.cjs
CHANGED
|
@@ -12,9 +12,11 @@
|
|
|
12
12
|
|
|
13
13
|
|
|
14
14
|
|
|
15
|
+
var _chunkJSSBHMMUcjs = require('../chunk-JSSBHMMU.cjs');
|
|
15
16
|
|
|
16
17
|
|
|
17
|
-
|
|
18
|
+
|
|
19
|
+
var _chunkCOAMRKVIcjs = require('../chunk-COAMRKVI.cjs');
|
|
18
20
|
require('../chunk-O6FO6VI3.cjs');
|
|
19
21
|
require('../chunk-5PTR7HTL.cjs');
|
|
20
22
|
require('../chunk-CKRNELPO.cjs');
|
|
@@ -35,5 +37,5 @@ require('../chunk-EMQWJA3G.cjs');
|
|
|
35
37
|
|
|
36
38
|
|
|
37
39
|
|
|
38
|
-
exports.DOCX_ANONYMOUS_AUTHOR =
|
|
40
|
+
exports.DOCX_ANONYMOUS_AUTHOR = _chunkJSSBHMMUcjs.DOCX_ANONYMOUS_AUTHOR; exports.DOCX_EXPORT_MIME_TYPE = _chunkJSSBHMMUcjs.DOCX_EXPORT_MIME_TYPE; exports.DocxExportController = _chunkJSSBHMMUcjs.DocxExportController; exports.XmlWriter = _chunkJSSBHMMUcjs.XmlWriter; exports.createDocxExportController = _chunkJSSBHMMUcjs.createDocxExportController; exports.createDocxParts = _chunkJSSBHMMUcjs.createDocxParts; exports.deflateRaw = _chunkCOAMRKVIcjs.deflateRaw; exports.docxFileName = _chunkJSSBHMMUcjs.docxFileName; exports.downloadBlob = _chunkJSSBHMMUcjs.downloadBlob; exports.escapeXmlAttr = _chunkJSSBHMMUcjs.escapeXmlAttr; exports.escapeXmlText = _chunkJSSBHMMUcjs.escapeXmlText; exports.exportDocx = _chunkJSSBHMMUcjs.exportDocx; exports.exportDocxBlob = _chunkJSSBHMMUcjs.exportDocxBlob; exports.stripInvalidXmlChars = _chunkJSSBHMMUcjs.stripInvalidXmlChars; exports.writeZip = _chunkCOAMRKVIcjs.writeZip;
|
|
39
41
|
//# sourceMappingURL=index.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/runner/work/editor/editor/packages/core/dist/export/index.cjs"],"names":[],"mappings":"AAAA;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/editor/editor/packages/core/dist/export/index.cjs"],"names":[],"mappings":"AAAA;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,yDAA8B;AAC9B;AACE;AACA;AACF,yDAA8B;AAC9B,iCAA8B;AAC9B,iCAA8B;AAC9B,iCAA8B;AAC9B,iCAA8B;AAC9B;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,g5BAAC","file":"/home/runner/work/editor/editor/packages/core/dist/export/index.cjs"}
|
package/dist/export/index.js
CHANGED
|
@@ -5,16 +5,18 @@ import {
|
|
|
5
5
|
XmlWriter,
|
|
6
6
|
createDocxExportController,
|
|
7
7
|
createDocxParts,
|
|
8
|
-
deflateRaw,
|
|
9
8
|
docxFileName,
|
|
10
9
|
downloadBlob,
|
|
11
10
|
escapeXmlAttr,
|
|
12
11
|
escapeXmlText,
|
|
13
12
|
exportDocx,
|
|
14
13
|
exportDocxBlob,
|
|
15
|
-
stripInvalidXmlChars
|
|
14
|
+
stripInvalidXmlChars
|
|
15
|
+
} from "../chunk-VJUML33I.js";
|
|
16
|
+
import {
|
|
17
|
+
deflateRaw,
|
|
16
18
|
writeZip
|
|
17
|
-
} from "../chunk-
|
|
19
|
+
} from "../chunk-LF4WOZXZ.js";
|
|
18
20
|
import "../chunk-AGGUNWT6.js";
|
|
19
21
|
import "../chunk-2GFUA4X5.js";
|
|
20
22
|
import "../chunk-633QC34G.js";
|
|
@@ -4,8 +4,8 @@ import { b as BuiltinProfileId, j as Intent, P as Profile, T as Transform, d as
|
|
|
4
4
|
import { A as AffineMatrix, Q as Quad, a as WarpMesh, V as Vec2$1, H as Homography } from './types-CwMPoRMU.cjs';
|
|
5
5
|
import { B as BezierPath } from './bezier-BfwIbVTl.cjs';
|
|
6
6
|
import { b as TextRun, P as ParagraphRun, T as TextShaper, c as ParagraphStyle, d as TextStyle, L as LaidFragment, W as WarpPreset, e as TextLayout } from './warp-B39VsOtd.cjs';
|
|
7
|
-
import { w as VectorSubpath, o as Vec2 } from './types-
|
|
8
|
-
import { B as BrushSettings, M as MixerSettings,
|
|
7
|
+
import { w as VectorSubpath, o as Vec2 } from './types-Tfly4Aya.cjs';
|
|
8
|
+
import { B as BrushSettings, M as MixerSettings, a as MixerLoad, R as RetouchSettings, S as StrokeCoverage, b as MixerTarget, c as MixerStroke, d as RetouchApply, e as StrokePoint, f as RetouchPaint, C as CoverageMap, P as PaintTileTarget, g as StrokeApply } from './flow-COCB42TP.cjs';
|
|
9
9
|
|
|
10
10
|
/**
|
|
11
11
|
* A selection: one 8-bit coverage value per image pixel (0 = not selected, 255 = fully
|
|
@@ -4,8 +4,8 @@ import { b as BuiltinProfileId, j as Intent, P as Profile, T as Transform, d as
|
|
|
4
4
|
import { A as AffineMatrix, Q as Quad, a as WarpMesh, V as Vec2$1, H as Homography } from './types-CwMPoRMU.js';
|
|
5
5
|
import { B as BezierPath } from './bezier-DYBvLgUH.js';
|
|
6
6
|
import { b as TextRun, P as ParagraphRun, T as TextShaper, c as ParagraphStyle, d as TextStyle, L as LaidFragment, W as WarpPreset, e as TextLayout } from './warp-DMN30aY6.js';
|
|
7
|
-
import { w as VectorSubpath, o as Vec2 } from './types-
|
|
8
|
-
import { B as BrushSettings, M as MixerSettings,
|
|
7
|
+
import { w as VectorSubpath, o as Vec2 } from './types-CDLGhAZp.js';
|
|
8
|
+
import { B as BrushSettings, M as MixerSettings, a as MixerLoad, R as RetouchSettings, S as StrokeCoverage, b as MixerTarget, c as MixerStroke, d as RetouchApply, e as StrokePoint, f as RetouchPaint, C as CoverageMap, P as PaintTileTarget, g as StrokeApply } from './flow-BMtHAmg4.js';
|
|
9
9
|
|
|
10
10
|
/**
|
|
11
11
|
* A selection: one 8-bit coverage value per image pixel (0 = not selected, 255 = fully
|
|
@@ -0,0 +1,501 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Keyframes for a clip's opacity, volume and transform. A property is either a plain number or
|
|
3
|
+
* `{ keys }`: values at clip-relative times (ms from the clip's start), each with the easing of the
|
|
4
|
+
* segment that leaves it. Pure functions only, so previews, renders and exports agree.
|
|
5
|
+
*
|
|
6
|
+
* Easing is stored as CSS `cubic-bezier(x1, y1, x2, y2)` control points (named easings are the CSS
|
|
7
|
+
* ones), which is also what After Effects / Lottie speed-and-influence handles convert to exactly.
|
|
8
|
+
*/
|
|
9
|
+
/** How a segment moves from its key to the next: a named curve, `hold` (jump at the next key) or CSS cubic-bezier points. */
|
|
10
|
+
type VideoEase = 'linear' | 'hold' | 'ease-in' | 'ease-out' | 'ease-in-out' | [number, number, number, number];
|
|
11
|
+
declare const VIDEO_EASE_NAMES: readonly ["linear", "hold", "ease-in", "ease-out", "ease-in-out"];
|
|
12
|
+
interface VideoKey {
|
|
13
|
+
/** Clip-relative time (ms from the clip's start). */
|
|
14
|
+
t: number;
|
|
15
|
+
v: number;
|
|
16
|
+
/** The segment from this key to the next (default linear). Ignored on the last key. */
|
|
17
|
+
ease?: VideoEase;
|
|
18
|
+
}
|
|
19
|
+
interface VideoKeyframes {
|
|
20
|
+
/** In time order, at least one. */
|
|
21
|
+
keys: VideoKey[];
|
|
22
|
+
}
|
|
23
|
+
/** A number, or keyframes for it. */
|
|
24
|
+
type VideoAnimatable = number | VideoKeyframes;
|
|
25
|
+
/** The clip properties that can be keyframed: `opacity`, `volume` (media) and the transform's fields. */
|
|
26
|
+
type VideoKeyframeProperty = 'opacity' | 'volume' | 'x' | 'y' | 'scale' | 'rotation';
|
|
27
|
+
declare const VIDEO_KEYFRAME_PROPERTIES: readonly ["opacity", "volume", "x", "y", "scale", "rotation"];
|
|
28
|
+
declare const VIDEO_TRANSFORM_PROPERTIES: readonly ["x", "y", "scale", "rotation"];
|
|
29
|
+
/** Each property's default and allowed range. */
|
|
30
|
+
declare const VIDEO_KEYFRAME_LIMITS: Record<VideoKeyframeProperty, {
|
|
31
|
+
default: number;
|
|
32
|
+
min?: number;
|
|
33
|
+
max?: number;
|
|
34
|
+
}>;
|
|
35
|
+
declare const isVideoKeyframes: (v: unknown) => v is VideoKeyframes;
|
|
36
|
+
/** The cubic-bezier points for an ease (`null` for linear and hold). */
|
|
37
|
+
declare function videoEaseBezier(ease: VideoEase | undefined): [number, number, number, number] | null;
|
|
38
|
+
/** How far (0–1 in, any y out) an ease has got at progress `p` (0–1) through its segment. */
|
|
39
|
+
declare function videoEaseProgress(ease: VideoEase | undefined, p: number): number;
|
|
40
|
+
/**
|
|
41
|
+
* A property's value at clip-relative time `clipTime` (ms): the number itself, or the keys
|
|
42
|
+
* interpolated (held before the first and after the last). `fallback` is used when it is unset.
|
|
43
|
+
*/
|
|
44
|
+
declare function videoValueAt(prop: VideoAnimatable | undefined, clipTime: number, fallback?: number): number;
|
|
45
|
+
/** A property's keys (a plain number or unset gives none). */
|
|
46
|
+
declare const videoKeysOf: (prop: VideoAnimatable | undefined) => VideoKey[];
|
|
47
|
+
/** Shifts every key by `dt` ms (or scales times by `k` first); numbers pass through. */
|
|
48
|
+
declare function retimeVideoAnimatable<T extends VideoAnimatable | undefined>(prop: T, dt: number, k?: number): T;
|
|
49
|
+
/**
|
|
50
|
+
* Splits keyframes at clip time `at`: the keys before it (with a key added at `at`) and the keys
|
|
51
|
+
* after it, moved to start at 0 (with a key added at 0). Eased segments across the cut are split
|
|
52
|
+
* into two curves that trace the same path, so the two halves play exactly as the whole did.
|
|
53
|
+
*/
|
|
54
|
+
declare function splitVideoAnimatable<T extends VideoAnimatable | undefined>(prop: T, at: number): [T, T];
|
|
55
|
+
/** The keys sorted by time, refusing two at the same time. */
|
|
56
|
+
declare function sortVideoKeys(keys: readonly VideoKey[]): VideoKey[];
|
|
57
|
+
/**
|
|
58
|
+
* Keys with one set (or replaced) at `t`: a plain value becomes keys holding it and the new one.
|
|
59
|
+
* For a keyframe toggle or "add key at playhead".
|
|
60
|
+
*/
|
|
61
|
+
declare function setVideoKey(prop: VideoAnimatable | undefined, key: VideoKey, fallback: number): VideoKeyframes;
|
|
62
|
+
/** Keys with the one at `t` removed; the value it then holds when none are left. */
|
|
63
|
+
declare function removeVideoKey(prop: VideoKeyframes, t: number): VideoAnimatable;
|
|
64
|
+
/**
|
|
65
|
+
* Breakpoints `[clipTime, value]` tracing a property as straight lines: linear segments as they
|
|
66
|
+
* are, holds as steps, eased segments sampled every `step` ms (about two frames).
|
|
67
|
+
*/
|
|
68
|
+
declare function videoKeyframeBreakpoints(prop: VideoKeyframes, step: number): {
|
|
69
|
+
points: [number, number][];
|
|
70
|
+
holds: Set<number>;
|
|
71
|
+
};
|
|
72
|
+
/**
|
|
73
|
+
* An ffmpeg expression for a property, given `time`: an expression for the clip-relative time in
|
|
74
|
+
* ms (e.g. `(t*1000-1500)`). Piecewise linear `if(lt(…))` chains; eased segments are baked to
|
|
75
|
+
* breakpoints every `step` ms.
|
|
76
|
+
*/
|
|
77
|
+
declare function videoKeyframeFfmpegExpr(prop: VideoAnimatable | undefined, time: string, fallback: number, step: number): string;
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* A video project is plain JSON: the media it uses (assets), tracks of clips placed on a timeline,
|
|
81
|
+
* and markers. Every time is in milliseconds; `fps` sets the frame grid edits snap to and exports use.
|
|
82
|
+
*
|
|
83
|
+
* Tracks are listed top to bottom as a timeline shows them: on screen, a clip on an earlier video
|
|
84
|
+
* track draws over one on a later track. Clips on one track never overlap.
|
|
85
|
+
*/
|
|
86
|
+
|
|
87
|
+
type VideoAssetKind = 'video' | 'audio' | 'image';
|
|
88
|
+
/** A spoken word in an asset's transcript, timed in the source (ms). */
|
|
89
|
+
interface VideoTranscriptWord {
|
|
90
|
+
word: string;
|
|
91
|
+
start: number;
|
|
92
|
+
end: number;
|
|
93
|
+
}
|
|
94
|
+
/** A smaller copy of an asset's media for the preview (see `VideoAsset.proxies`). */
|
|
95
|
+
interface VideoAssetProxy {
|
|
96
|
+
/** Its size as a fraction of the original (0.5 = half width and height). */
|
|
97
|
+
scale: number;
|
|
98
|
+
/** What the preview loads instead of the original. */
|
|
99
|
+
src: string;
|
|
100
|
+
width?: number;
|
|
101
|
+
height?: number;
|
|
102
|
+
}
|
|
103
|
+
/** A piece of source media. The project refers to it by id; `src` is whatever the host can load. */
|
|
104
|
+
interface VideoAsset {
|
|
105
|
+
id: string;
|
|
106
|
+
kind: VideoAssetKind;
|
|
107
|
+
/** URL, blob URL, path or data URL (whatever the playback engine and exporter can open). */
|
|
108
|
+
src: string;
|
|
109
|
+
name?: string;
|
|
110
|
+
/** Length of the source (ms). Required for video and audio; images have none. */
|
|
111
|
+
duration?: number;
|
|
112
|
+
/** Intrinsic size in pixels (video and image). Placement assumes the project size when missing. */
|
|
113
|
+
width?: number;
|
|
114
|
+
height?: number;
|
|
115
|
+
/** Whether a video asset has sound (default true). */
|
|
116
|
+
hasAudio?: boolean;
|
|
117
|
+
/** A still to show for a video where its frames cannot be drawn (SVG renders, thumbnails). */
|
|
118
|
+
poster?: string;
|
|
119
|
+
/** What is said in it, word by word, timed in the source (see `parseVideoTranscript`). */
|
|
120
|
+
transcript?: VideoTranscriptWord[];
|
|
121
|
+
/**
|
|
122
|
+
* Smaller copies of a video for smooth editing (see `videoProxyFfmpeg`). The preview plays the
|
|
123
|
+
* one its preview scale picks; exports and EDLs always use `src`. A proxy must have the same
|
|
124
|
+
* length and timing as the original.
|
|
125
|
+
*/
|
|
126
|
+
proxies?: VideoAssetProxy[];
|
|
127
|
+
}
|
|
128
|
+
type VideoTrackKind = 'video' | 'audio';
|
|
129
|
+
interface VideoTrack {
|
|
130
|
+
id: string;
|
|
131
|
+
kind: VideoTrackKind;
|
|
132
|
+
name?: string;
|
|
133
|
+
/** Silences every clip on the track. */
|
|
134
|
+
muted?: boolean;
|
|
135
|
+
/** Leaves the track's pictures out of the frame. */
|
|
136
|
+
hidden?: boolean;
|
|
137
|
+
/** Refuses edits to the track's clips. */
|
|
138
|
+
locked?: boolean;
|
|
139
|
+
/**
|
|
140
|
+
* Moves with ripple edits made on other sync-locked tracks, so it stays in sync (default true).
|
|
141
|
+
* Turn it off for a track that should stay put while the others ripple (e.g. a music bed).
|
|
142
|
+
*/
|
|
143
|
+
syncLocked?: boolean;
|
|
144
|
+
/** Gain applied to every clip on the track (1 = unchanged, default 1). */
|
|
145
|
+
volume?: number;
|
|
146
|
+
clips: VideoClip[];
|
|
147
|
+
}
|
|
148
|
+
/** Where a picture sits in the frame, after it has been fitted. Each field may be keyframed. */
|
|
149
|
+
interface VideoTransform {
|
|
150
|
+
/** Offset of the centre from the frame's centre, in pixels (default 0). */
|
|
151
|
+
x?: VideoAnimatable;
|
|
152
|
+
y?: VideoAnimatable;
|
|
153
|
+
/** 1 = fitted size (default 1). */
|
|
154
|
+
scale?: VideoAnimatable;
|
|
155
|
+
/** Degrees clockwise (default 0). */
|
|
156
|
+
rotation?: VideoAnimatable;
|
|
157
|
+
}
|
|
158
|
+
/** How a picture is fitted to the frame before its transform: like CSS `object-fit`. */
|
|
159
|
+
type VideoFit = 'contain' | 'cover' | 'fill' | 'none';
|
|
160
|
+
declare const VIDEO_FITS: readonly ["contain", "cover", "fill", "none"];
|
|
161
|
+
/**
|
|
162
|
+
* - `crossfade`: this clip fades up over the one before.
|
|
163
|
+
* - `dip`: down into a colour and up out of it.
|
|
164
|
+
* - `wipe`: an edge travels across, revealing this clip.
|
|
165
|
+
* - `push`: this clip slides in, pushing the one before out.
|
|
166
|
+
* - `slide`: this clip slides in over the one before, which stays put.
|
|
167
|
+
* - `iris`: a circle opens from the centre, revealing this clip.
|
|
168
|
+
*/
|
|
169
|
+
type VideoTransitionType = 'crossfade' | 'dip' | 'wipe' | 'push' | 'slide' | 'iris';
|
|
170
|
+
declare const VIDEO_TRANSITION_TYPES: readonly ["crossfade", "dip", "wipe", "push", "slide", "iris"];
|
|
171
|
+
type VideoWipeDirection = 'left' | 'right' | 'up' | 'down';
|
|
172
|
+
declare const VIDEO_WIPE_DIRECTIONS: readonly ["left", "right", "up", "down"];
|
|
173
|
+
/**
|
|
174
|
+
* A transition into a clip from the clip that ends where it starts on the same track. It plays over
|
|
175
|
+
* the cut, half before and half after, so both clips run past the cut into their handles (media
|
|
176
|
+
* beyond the out point of the one before, before the in point of this one).
|
|
177
|
+
*/
|
|
178
|
+
interface VideoTransition {
|
|
179
|
+
type: VideoTransitionType;
|
|
180
|
+
/** Length (ms), centred on the cut. */
|
|
181
|
+
duration: number;
|
|
182
|
+
/** For dip: the colour passed through (default black). */
|
|
183
|
+
color?: string;
|
|
184
|
+
/** For wipe, push and slide: the way the edge or picture travels (default right: in from the left). */
|
|
185
|
+
direction?: VideoWipeDirection;
|
|
186
|
+
/**
|
|
187
|
+
* Shape of the sound's fades through the transition (see `VideoFadeCurve`). Default
|
|
188
|
+
* `equal-power` for crossfades and wipes, where two sounds overlap and a linear mix dips in
|
|
189
|
+
* loudness halfway; `linear` for dips, where one sound fades out before the other fades in.
|
|
190
|
+
*/
|
|
191
|
+
audioCurve?: VideoFadeCurve;
|
|
192
|
+
}
|
|
193
|
+
/** The curve a transition's sound fades follow (its `audioCurve`, else the default for its type). */
|
|
194
|
+
declare const videoTransitionAudioCurve: (t: VideoTransition) => VideoFadeCurve;
|
|
195
|
+
/**
|
|
196
|
+
* How a clip's picture mixes with what is beneath it, as in CSS `mix-blend-mode` (`add` sums the
|
|
197
|
+
* colours, `plus-lighter` in CSS). These are the modes the canvas preview, SVG frames and ffmpeg's
|
|
198
|
+
* `blend` filter all share.
|
|
199
|
+
*/
|
|
200
|
+
type VideoBlendMode = 'normal' | 'multiply' | 'screen' | 'overlay' | 'darken' | 'lighten' | 'color-dodge' | 'color-burn' | 'hard-light' | 'soft-light' | 'difference' | 'exclusion' | 'add';
|
|
201
|
+
declare const VIDEO_BLEND_MODES: readonly ["normal", "multiply", "screen", "overlay", "darken", "lighten", "color-dodge", "color-burn", "hard-light", "soft-light", "difference", "exclusion", "add"];
|
|
202
|
+
/** A 3D LUT a grade applies after its other steps (see `VideoGrade.lut`). */
|
|
203
|
+
interface VideoGradeLut {
|
|
204
|
+
/** A `.cube` file: whatever the host can load (URL, path) and the exporter can open. */
|
|
205
|
+
src: string;
|
|
206
|
+
/** How much of the LUT's change to apply, 0–1 (default 1). */
|
|
207
|
+
strength?: number;
|
|
208
|
+
/** A label for the look (default the file's TITLE or name). */
|
|
209
|
+
name?: string;
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Colour correction for a clip's picture (see `VIDEO_GRADE_CONTROLS` for ranges). Applied in a fixed
|
|
213
|
+
* order: exposure, contrast, saturation, hue, white balance (temperature and tint), then the LUT.
|
|
214
|
+
*/
|
|
215
|
+
interface VideoGrade {
|
|
216
|
+
/** Stops: +1 doubles every channel (default 0). */
|
|
217
|
+
exposure?: number;
|
|
218
|
+
/** -1 (flat grey) to 1 (twice as steep), around mid grey (default 0). */
|
|
219
|
+
contrast?: number;
|
|
220
|
+
/** -1 (black and white) to 1 (twice as saturated); default 0. */
|
|
221
|
+
saturation?: number;
|
|
222
|
+
/** Hue rotation in degrees (default 0). */
|
|
223
|
+
hue?: number;
|
|
224
|
+
/** -1 (cool) to 1 (warm); default 0. */
|
|
225
|
+
temperature?: number;
|
|
226
|
+
/** -1 (green) to 1 (magenta); default 0. */
|
|
227
|
+
tint?: number;
|
|
228
|
+
/** A 3D LUT (a `.cube` file) applied last, mixed in at its `strength`. */
|
|
229
|
+
lut?: VideoGradeLut;
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* How a clip enters or leaves: `fade`; `rise` (up into place) or `drop` (down into place);
|
|
233
|
+
* `slide-left` / `slide-right` (in moving that way); `zoom` (grows into place); `pop` (grows past its
|
|
234
|
+
* size and settles). Each also fades. An exit plays the same movement backwards.
|
|
235
|
+
*/
|
|
236
|
+
type VideoClipAnimationEffect = 'fade' | 'rise' | 'drop' | 'slide-left' | 'slide-right' | 'zoom' | 'pop';
|
|
237
|
+
declare const VIDEO_CLIP_ANIMATION_EFFECTS: readonly ["fade", "rise", "drop", "slide-left", "slide-right", "zoom", "pop"];
|
|
238
|
+
/** An entrance or exit animation (see `VideoClipAnimationEffect`). */
|
|
239
|
+
interface VideoClipAnimation {
|
|
240
|
+
effect: VideoClipAnimationEffect;
|
|
241
|
+
/** Length (ms, default 500). */
|
|
242
|
+
duration?: number;
|
|
243
|
+
}
|
|
244
|
+
interface VideoClipBase {
|
|
245
|
+
id: string;
|
|
246
|
+
name?: string;
|
|
247
|
+
/** Where it starts on the timeline (ms). */
|
|
248
|
+
start: number;
|
|
249
|
+
/** How long it lasts on the timeline (ms). */
|
|
250
|
+
duration: number;
|
|
251
|
+
/** 0–1 (default 1), or keyframes (`{ keys: [{ t, v, ease }] }`, `t` in ms from the clip's start). */
|
|
252
|
+
opacity?: VideoAnimatable;
|
|
253
|
+
transform?: VideoTransform;
|
|
254
|
+
/** Default contain. */
|
|
255
|
+
fit?: VideoFit;
|
|
256
|
+
/** How the picture mixes with what is beneath it (default normal). */
|
|
257
|
+
blend?: VideoBlendMode;
|
|
258
|
+
/** Colour correction of the picture. */
|
|
259
|
+
grade?: VideoGrade;
|
|
260
|
+
/** How the picture enters, from the clip's start (on top of any fade in). */
|
|
261
|
+
animateIn?: VideoClipAnimation;
|
|
262
|
+
/** How the picture leaves, up to the clip's end. */
|
|
263
|
+
animateOut?: VideoClipAnimation;
|
|
264
|
+
/** Fade in from nothing over this long (ms), pictures and sound. */
|
|
265
|
+
fadeIn?: number;
|
|
266
|
+
/** Fade out over this long (ms). */
|
|
267
|
+
fadeOut?: number;
|
|
268
|
+
/** Transition from the clip before (see `VideoTransition`). */
|
|
269
|
+
transition?: VideoTransition;
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* The shape of a sound fade, the same curves ffmpeg's `afade` draws, so previews and exports agree.
|
|
273
|
+
* With `x` running 0→1 through a fade in (1→0 through a fade out), the gain is:
|
|
274
|
+
* - `linear`: x (ffmpeg `tri`). Dips in loudness in the middle of a crossfade.
|
|
275
|
+
* - `equal-power`: sin(x·π/2) (`qsin`). Keeps loudness steady; the usual choice for crossfades.
|
|
276
|
+
* - `s-curve`: (1 − cos(x·π))/2 (`hsin`). Gentle at both ends.
|
|
277
|
+
* - `exponential`: x³ (`cub`). Slow start; a natural-sounding fade in from silence.
|
|
278
|
+
* - `logarithmic`: 1 − (1 − x)² (`ipar`). Fast start, slow finish.
|
|
279
|
+
*/
|
|
280
|
+
type VideoFadeCurve = 'linear' | 'equal-power' | 's-curve' | 'exponential' | 'logarithmic';
|
|
281
|
+
declare const VIDEO_FADE_CURVES: readonly ["linear", "equal-power", "s-curve", "exponential", "logarithmic"];
|
|
282
|
+
/** A stretch of an asset. */
|
|
283
|
+
interface VideoMediaClip extends VideoClipBase {
|
|
284
|
+
type: 'media';
|
|
285
|
+
asset: string;
|
|
286
|
+
/** Where in the source it starts (ms, default 0). */
|
|
287
|
+
in?: number;
|
|
288
|
+
/** Playback speed (default 1): it uses `duration × speed` of the source. */
|
|
289
|
+
speed?: number;
|
|
290
|
+
/**
|
|
291
|
+
* A speed ramp: keys mapping clip time to source time after the in point (`v` ms from `in`), so
|
|
292
|
+
* a key's slope is the speed there, a flat stretch is a freeze frame and eased keys ramp between
|
|
293
|
+
* speeds. Never runs backwards. Before the first key and after the last the picture holds. Takes
|
|
294
|
+
* the place of `speed` (see `videoSpeedRampKeys` for building one from speeds).
|
|
295
|
+
*/
|
|
296
|
+
timeRemap?: VideoKeyframes;
|
|
297
|
+
/** Gain (1 = unchanged, default 1), or keyframes. */
|
|
298
|
+
volume?: VideoAnimatable;
|
|
299
|
+
/** Silences this clip. */
|
|
300
|
+
muted?: boolean;
|
|
301
|
+
/** Shape of the sound's fade in (default linear). The picture always fades linearly. */
|
|
302
|
+
fadeInCurve?: VideoFadeCurve;
|
|
303
|
+
/** Shape of the sound's fade out (default linear). */
|
|
304
|
+
fadeOutCurve?: VideoFadeCurve;
|
|
305
|
+
}
|
|
306
|
+
/** A title. */
|
|
307
|
+
interface VideoTextClip extends VideoClipBase {
|
|
308
|
+
type: 'text';
|
|
309
|
+
text: string;
|
|
310
|
+
/** CSS colour (default white). */
|
|
311
|
+
color?: string;
|
|
312
|
+
/** Pixels (default 64). */
|
|
313
|
+
fontSize?: number;
|
|
314
|
+
/** Default sans-serif. */
|
|
315
|
+
fontFamily?: string;
|
|
316
|
+
/** Default 700. */
|
|
317
|
+
fontWeight?: number;
|
|
318
|
+
/** Box behind the text (CSS colour); none by default. */
|
|
319
|
+
background?: string;
|
|
320
|
+
}
|
|
321
|
+
/** A solid colour filling the frame. */
|
|
322
|
+
interface VideoColorClip extends VideoClipBase {
|
|
323
|
+
type: 'color';
|
|
324
|
+
color: string;
|
|
325
|
+
}
|
|
326
|
+
/**
|
|
327
|
+
* A compound clip: a nested sequence (see `VideoProject.sequences`) played as one picture and one
|
|
328
|
+
* sound. It plays the sequence's own time from `in`, at normal speed. Its opacity, transform, blend,
|
|
329
|
+
* grade, fades, transitions and animations apply to the sequence's composite, not to each of its
|
|
330
|
+
* clips; its volume and fades apply to the sequence's mixed sound.
|
|
331
|
+
*/
|
|
332
|
+
interface VideoSequenceClip extends VideoClipBase {
|
|
333
|
+
type: 'sequence';
|
|
334
|
+
/** The id of the sequence it plays (in `project.sequences`). */
|
|
335
|
+
sequence: string;
|
|
336
|
+
/** Where in the sequence's time it starts (ms, default 0). */
|
|
337
|
+
in?: number;
|
|
338
|
+
/** Gain on the sequence's sound (1 = unchanged, default 1), or keyframes. */
|
|
339
|
+
volume?: VideoAnimatable;
|
|
340
|
+
/** Silences the sequence's sound. */
|
|
341
|
+
muted?: boolean;
|
|
342
|
+
/** Shape of the sound's fade in (default linear). */
|
|
343
|
+
fadeInCurve?: VideoFadeCurve;
|
|
344
|
+
/** Shape of the sound's fade out (default linear). */
|
|
345
|
+
fadeOutCurve?: VideoFadeCurve;
|
|
346
|
+
}
|
|
347
|
+
type VideoClip = VideoMediaClip | VideoTextClip | VideoColorClip | VideoSequenceClip;
|
|
348
|
+
type VideoClipType = VideoClip['type'];
|
|
349
|
+
/**
|
|
350
|
+
* How a clip is placed where others already are: `refuse` an overlap (the default), `overwrite`
|
|
351
|
+
* what is underneath (cutting, trimming or removing it), or `insert` (cut everything across the
|
|
352
|
+
* point and push later material along on every sync-locked track).
|
|
353
|
+
*/
|
|
354
|
+
type VideoPlacementMode = 'refuse' | 'overwrite' | 'insert';
|
|
355
|
+
declare const VIDEO_PLACEMENT_MODES: readonly ["refuse", "overwrite", "insert"];
|
|
356
|
+
declare const VIDEO_CLIP_TYPES: readonly ["media", "text", "color", "sequence"];
|
|
357
|
+
interface VideoMarker {
|
|
358
|
+
id: string;
|
|
359
|
+
time: number;
|
|
360
|
+
label?: string;
|
|
361
|
+
/** CSS colour. */
|
|
362
|
+
color?: string;
|
|
363
|
+
}
|
|
364
|
+
/**
|
|
365
|
+
* A nested sequence: tracks of clips with their own timeline from 0, played inside the project by
|
|
366
|
+
* compound clips (`type: 'sequence'`). Its frame is the project's frame size, transparent where no
|
|
367
|
+
* clip covers it. A sequence may hold compound clips of other sequences, but never itself (directly
|
|
368
|
+
* or through others).
|
|
369
|
+
*/
|
|
370
|
+
interface VideoSequence {
|
|
371
|
+
id: string;
|
|
372
|
+
name?: string;
|
|
373
|
+
tracks: VideoTrack[];
|
|
374
|
+
}
|
|
375
|
+
interface VideoProject {
|
|
376
|
+
version: 1;
|
|
377
|
+
name?: string;
|
|
378
|
+
/** Frame size in pixels. */
|
|
379
|
+
width: number;
|
|
380
|
+
height: number;
|
|
381
|
+
/** Frames per second: the grid edits snap to and exports use. */
|
|
382
|
+
fps: number;
|
|
383
|
+
/** What shows where no clip covers the frame (default black). */
|
|
384
|
+
background?: string;
|
|
385
|
+
assets: VideoAsset[];
|
|
386
|
+
tracks: VideoTrack[];
|
|
387
|
+
/** Nested sequences that compound clips play (see `VideoSequence`). */
|
|
388
|
+
sequences?: VideoSequence[];
|
|
389
|
+
markers?: VideoMarker[];
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
interface VideoEdlOptions {
|
|
393
|
+
/** Track to export (default: the bottom video track, V1 in most NLEs). */
|
|
394
|
+
track?: string;
|
|
395
|
+
/** Record timecode of the timeline's start (ms; default timecode 01:00:00:00, the usual start). */
|
|
396
|
+
recordStart?: number;
|
|
397
|
+
/** Title line (default: the project's name). */
|
|
398
|
+
title?: string;
|
|
399
|
+
/** Drop-frame timecode (default on at 29.97 and 59.94 fps, where it is the norm; ignored at other rates). */
|
|
400
|
+
dropFrame?: boolean;
|
|
401
|
+
}
|
|
402
|
+
/**
|
|
403
|
+
* One track as a CMX 3600 edit decision list, for conforming in another NLE: an event per clip with
|
|
404
|
+
* source and record timecode at the project's frame rate (drop-frame at 29.97 and 59.94), dissolves (`D`) for crossfades, dips and
|
|
405
|
+
* wipes (`W001`), `M2` lines for speed changes, and `* FROM CLIP NAME` comments. Titles, colour
|
|
406
|
+
* clips and compound clips (not flattened yet) become black (`BL`) events.
|
|
407
|
+
*/
|
|
408
|
+
declare function toVideoEdl(project: VideoProject, options?: VideoEdlOptions): string;
|
|
409
|
+
interface VideoFfmpegOptions {
|
|
410
|
+
/** Output file (default `output.mp4`). */
|
|
411
|
+
output?: string;
|
|
412
|
+
/** The path or URL ffmpeg should open for an asset (default its `src`). */
|
|
413
|
+
resolve?: (asset: VideoAsset) => string;
|
|
414
|
+
/** The path ffmpeg's `lut3d` should read for a grade's LUT `src` (default the `src`; it must be a local file). */
|
|
415
|
+
resolveLut?: (src: string) => string;
|
|
416
|
+
/** Default `libx264`. */
|
|
417
|
+
videoCodec?: string;
|
|
418
|
+
/** Default `aac`. */
|
|
419
|
+
audioCodec?: string;
|
|
420
|
+
/** x264 quality (default 18). */
|
|
421
|
+
crf?: number;
|
|
422
|
+
/** A font file for titles (drawtext's `fontfile`); default the system's font for the family. */
|
|
423
|
+
fontFile?: string;
|
|
424
|
+
/**
|
|
425
|
+
* Titles as images instead of `drawtext` (which needs an ffmpeg built with libfreetype; Homebrew's
|
|
426
|
+
* is not): return the path or URL of a transparent PNG the size of the frame showing the title as
|
|
427
|
+
* the preview draws it (`videoTitleFrame` + `drawVideoFrame`). It is overlaid like a still, with
|
|
428
|
+
* the title's opacity and fades.
|
|
429
|
+
*/
|
|
430
|
+
titleImage?: (clip: VideoTextClip, size: {
|
|
431
|
+
width: number;
|
|
432
|
+
height: number;
|
|
433
|
+
}) => string;
|
|
434
|
+
/** Normalise the mix's loudness with ffmpeg's `loudnorm` (EBU R128). */
|
|
435
|
+
loudness?: VideoLoudnessTarget;
|
|
436
|
+
}
|
|
437
|
+
/** A loudness to normalise the mix to (`loudnorm`'s I, TP and LRA). */
|
|
438
|
+
interface VideoLoudnessTarget {
|
|
439
|
+
/** Integrated loudness, in LUFS (default -14, as streaming services play; -16 for podcasts, -23 for EBU R128 broadcast). */
|
|
440
|
+
integrated?: number;
|
|
441
|
+
/** Highest true peak, in dBTP (default -1). */
|
|
442
|
+
truePeak?: number;
|
|
443
|
+
/** Loudness range, in LU (default 11). */
|
|
444
|
+
range?: number;
|
|
445
|
+
/**
|
|
446
|
+
* The mix as a first pass measured it (`toVideoLoudnessMeasure` then
|
|
447
|
+
* `parseVideoLoudnessMeasurement`). With it the second pass applies one fixed gain where it can
|
|
448
|
+
* (linear), so the dynamics are kept; without it `loudnorm` adjusts as it goes in one pass.
|
|
449
|
+
*/
|
|
450
|
+
measured?: VideoLoudnessMeasurement;
|
|
451
|
+
}
|
|
452
|
+
/** What a measuring pass found (`loudnorm`'s input_i, input_tp, input_lra, input_thresh and target_offset). */
|
|
453
|
+
interface VideoLoudnessMeasurement {
|
|
454
|
+
/** Integrated loudness (LUFS). */
|
|
455
|
+
integrated: number;
|
|
456
|
+
/** True peak (dBTP). */
|
|
457
|
+
truePeak: number;
|
|
458
|
+
/** Loudness range (LU). */
|
|
459
|
+
range: number;
|
|
460
|
+
/** Gating threshold (LUFS). */
|
|
461
|
+
threshold: number;
|
|
462
|
+
/** Offset for the second pass (LU). */
|
|
463
|
+
offset: number;
|
|
464
|
+
}
|
|
465
|
+
/**
|
|
466
|
+
* Reads the loudness a measuring pass printed (the JSON `loudnorm` writes to stderr at the end of
|
|
467
|
+
* `toVideoLoudnessMeasure`'s command). Throws when there is none, or when the mix is silent.
|
|
468
|
+
*/
|
|
469
|
+
declare function parseVideoLoudnessMeasurement(output: string): VideoLoudnessMeasurement;
|
|
470
|
+
interface VideoFfmpegExport {
|
|
471
|
+
/** Arguments after `ffmpeg` (pass to `spawn('ffmpeg', args)`; no shell quoting needed). */
|
|
472
|
+
args: string[];
|
|
473
|
+
/** The same as one shell command line, quoted for a POSIX shell. */
|
|
474
|
+
command: string;
|
|
475
|
+
/** The `-filter_complex` graph on its own. */
|
|
476
|
+
filterComplex: string;
|
|
477
|
+
/** Length rendered (ms). */
|
|
478
|
+
duration: number;
|
|
479
|
+
/** Anything the render only approximates. */
|
|
480
|
+
notes: string[];
|
|
481
|
+
}
|
|
482
|
+
/** Escapes a value for a filter option inside a filtergraph (option level, then graph level). */
|
|
483
|
+
declare const ffmpegFilterValue: (s: string) => string;
|
|
484
|
+
/** Quotes an argument for a POSIX shell when it needs it. */
|
|
485
|
+
declare const videoShellQuote: (s: string) => string;
|
|
486
|
+
/**
|
|
487
|
+
* The project as an ffmpeg command: each clip an input trimmed to what it plays (plus transition
|
|
488
|
+
* overlap), scaled and placed as `videoFrameAt` places it, faded, and overlaid on a background in
|
|
489
|
+
* track order between its start and end; titles with `drawtext`; sound delayed into place, faded,
|
|
490
|
+
* mixed and trimmed to the project's length. Render on a server or with ffmpeg.wasm.
|
|
491
|
+
*/
|
|
492
|
+
declare function toVideoFfmpeg(project: VideoProject, options?: VideoFfmpegOptions): VideoFfmpegExport;
|
|
493
|
+
/**
|
|
494
|
+
* The first pass of a two-pass loudness normalisation: an ffmpeg command that mixes only the sound,
|
|
495
|
+
* as `toVideoFfmpeg` would, and prints its loudness as JSON on stderr instead of writing a file.
|
|
496
|
+
* Read it with `parseVideoLoudnessMeasurement` and pass it as `loudness.measured` to
|
|
497
|
+
* `toVideoFfmpeg`. Throws when nothing on the timeline makes a sound.
|
|
498
|
+
*/
|
|
499
|
+
declare function toVideoLoudnessMeasure(project: VideoProject, options?: Pick<VideoFfmpegOptions, 'resolve' | 'loudness'>): VideoFfmpegExport;
|
|
500
|
+
|
|
501
|
+
export { removeVideoKey as $, type VideoFfmpegExport as A, type VideoEdlOptions as B, type VideoAssetKind as C, type VideoClipAnimationEffect as D, type VideoTransitionType as E, VIDEO_BLEND_MODES as F, VIDEO_CLIP_ANIMATION_EFFECTS as G, VIDEO_CLIP_TYPES as H, VIDEO_EASE_NAMES as I, VIDEO_FADE_CURVES as J, VIDEO_FITS as K, VIDEO_KEYFRAME_LIMITS as L, VIDEO_KEYFRAME_PROPERTIES as M, VIDEO_PLACEMENT_MODES as N, VIDEO_TRANSFORM_PROPERTIES as O, VIDEO_TRANSITION_TYPES as P, VIDEO_WIPE_DIRECTIONS as Q, type VideoClipType as R, type VideoColorClip as S, type VideoEase as T, type VideoLoudnessMeasurement as U, type VideoProject as V, type VideoLoudnessTarget as W, type VideoSequenceClip as X, ffmpegFilterValue as Y, isVideoKeyframes as Z, parseVideoLoudnessMeasurement as _, type VideoAnimatable as a, retimeVideoAnimatable as a0, setVideoKey as a1, sortVideoKeys as a2, splitVideoAnimatable as a3, toVideoEdl as a4, toVideoFfmpeg as a5, toVideoLoudnessMeasure as a6, videoEaseBezier as a7, videoEaseProgress as a8, videoKeyframeBreakpoints as a9, videoKeyframeFfmpegExpr as aa, videoShellQuote as ab, videoTransitionAudioCurve as ac, videoValueAt as ad, type VideoAsset as b, type VideoAssetProxy as c, type VideoClip as d, type VideoClipAnimation as e, type VideoGrade as f, type VideoGradeLut as g, type VideoKeyframes as h, type VideoMarker as i, type VideoSequence as j, type VideoTrack as k, type VideoTranscriptWord as l, type VideoTransform as m, type VideoTransition as n, type VideoTrackKind as o, type VideoPlacementMode as p, type VideoKeyframeProperty as q, type VideoKey as r, type VideoWipeDirection as s, type VideoBlendMode as t, type VideoFit as u, videoKeysOf as v, type VideoFadeCurve as w, type VideoTextClip as x, type VideoMediaClip as y, type VideoFfmpegOptions as z };
|