nodejs-audio-visualizer 4.5.1 → 5.1.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/README.md +3 -3
- package/dist/audio.d.ts +1 -0
- package/dist/audio.js +8 -0
- package/dist/audio.js.map +1 -1
- package/dist/beats.d.ts +20 -0
- package/dist/beats.js +180 -3
- package/dist/beats.js.map +1 -1
- package/dist/highlight.d.ts +2 -0
- package/dist/highlight.js +33 -24
- package/dist/highlight.js.map +1 -1
- package/dist/image.d.ts +13 -0
- package/dist/image.js +80 -0
- package/dist/image.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +82 -47
- package/dist/index.js.map +1 -1
- package/dist/video.d.ts +41 -1
- package/dist/video.js +150 -2
- package/dist/video.js.map +1 -1
- package/package.json +3 -2
- package/src/audio.ts +9 -0
- package/src/beats.ts +214 -3
- package/src/highlight.ts +21 -14
- package/src/image.ts +98 -0
- package/src/index.ts +85 -29
- package/src/tests/audio.test.ts +6 -0
- package/src/tests/beats.test.ts +134 -0
- package/src/tests/image.test.ts +86 -0
- package/src/tests/index.test.ts +68 -0
- package/src/tests/video.test.ts +163 -1
- package/src/typings.d.ts +22 -0
- package/src/video.ts +173 -1
package/README.md
CHANGED
|
@@ -12,7 +12,7 @@ const config = {
|
|
|
12
12
|
// OR use a video as background (optional):
|
|
13
13
|
// video: {
|
|
14
14
|
// path: 'media/background.mp4', // Supports MP4, MOV, AVI, MKV. Loops automatically if shorter than audio.
|
|
15
|
-
// autoEdit: true, // Optional. Detects scene cuts and advances between them on
|
|
15
|
+
// autoEdit: true, // Optional. Detects scene cuts and advances between them on the detected BPM beat grid about every 2–4 beats so the background edits with the music; omit or false for one continuous play-through from the start. When enabled, a brief camera shake every second beat decays over about one-third of a beat.
|
|
16
16
|
// },
|
|
17
17
|
audio: {
|
|
18
18
|
path: 'media/audio.wav', // Supports MP3 and WAV audio
|
|
@@ -28,7 +28,7 @@ const config = {
|
|
|
28
28
|
},
|
|
29
29
|
fps: 25, // Default value: 30
|
|
30
30
|
resolution: { width: 1920, height: 1080 }, // Optional. Output frame size in pixels. Omit to keep the background image or video at its native resolution; when set, video frames are scaled to this size and images are resized (center-cropped first if landscape/portrait does not match the target aspect).
|
|
31
|
-
spectrum: { // Audio spectrum configuration (linear bar visualizer). Optional. If neither 'spectrum' nor 'polar' is specified,
|
|
31
|
+
spectrum: { // Audio spectrum configuration (linear bar visualizer). Optional. If neither 'spectrum' nor 'polar' is specified, no visualizer is drawn.
|
|
32
32
|
width: '30%', // 30% of background image width. Default value: 33%. Also you can use absolute values. For example, value 300 for 300 pixels width.
|
|
33
33
|
height: '15%', // 15% of background image height. Default value: 160. Also you can use absolute values. For example, value 300 for 300 pixels height.
|
|
34
34
|
x: 'center', // Available values: 'left', 'center', right'. Also you can use absolute number values. For example, value 300 for 300 pixels x.
|
|
@@ -38,7 +38,7 @@ const config = {
|
|
|
38
38
|
color: '#cccc99', // Default value: inverted color of background image
|
|
39
39
|
opacity: '70%' // Default value: '80%'.
|
|
40
40
|
},
|
|
41
|
-
polar: { // Polar/circular audio spectrum configuration
|
|
41
|
+
polar: { // Polar/circular audio spectrum configuration. Optional. Use either 'spectrum' or 'polar', not both.
|
|
42
42
|
x: 'center', // Available values: 'left', 'center', 'right'. Also you can use absolute number values. Default value: 'center'.
|
|
43
43
|
y: 'middle', // Available values: 'top', 'middle', 'bottom'. Also you can use absolute number values. Default value: 'middle'.
|
|
44
44
|
innerRadius: 100, // Inner radius of the circular spectrum in pixels. Default value: 100.
|
package/dist/audio.d.ts
CHANGED
|
@@ -5,6 +5,7 @@ export declare const correctPeaks: (spectrums: number[], peaks: number[]) => num
|
|
|
5
5
|
export declare const createSpectrumsProcessor: (sampleRate: number, skipFramesCount: number) => (parseAudioData: () => number[]) => number[];
|
|
6
6
|
export declare const bufferToUInt8: (buffer: Buffer, start: number, end: number) => number[];
|
|
7
7
|
export declare const normalizeAudioData: (PCMData: number[]) => number[];
|
|
8
|
+
export declare const pcmU8ToFloatSamples: (buffer: Buffer) => number[];
|
|
8
9
|
export declare const spawnFfmpegAudioReader: (filename: string, format: string) => import("child_process").ChildProcessWithoutNullStreams;
|
|
9
10
|
export declare const createAudioBuffer: (filename: string, format: string) => Promise<{
|
|
10
11
|
audioBuffer: Buffer;
|
package/dist/audio.js
CHANGED
|
@@ -90,6 +90,14 @@ exports.bufferToUInt8 = function (buffer, start, end) {
|
|
|
90
90
|
exports.normalizeAudioData = function (PCMData) {
|
|
91
91
|
return PCMData.map(function (num) { return (num - 128) / 128; });
|
|
92
92
|
};
|
|
93
|
+
exports.pcmU8ToFloatSamples = function (buffer) {
|
|
94
|
+
var n = buffer.length;
|
|
95
|
+
var samples = new Array(n);
|
|
96
|
+
for (var i = 0; i < n; i++) {
|
|
97
|
+
samples[i] = (buffer[i] - 128) / 128;
|
|
98
|
+
}
|
|
99
|
+
return samples;
|
|
100
|
+
};
|
|
93
101
|
exports.spawnFfmpegAudioReader = function (filename, format) {
|
|
94
102
|
if (!ffmpeg_static_1.default) {
|
|
95
103
|
throw new Error('ffmpeg path not found');
|
package/dist/audio.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audio.js","sourceRoot":"","sources":["../src/audio.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"audio.js","sourceRoot":"","sources":["../src/audio.ts"],"names":[],"mappings":"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"}
|
package/dist/beats.d.ts
CHANGED
|
@@ -16,4 +16,24 @@ export interface BeatDetectorOptions {
|
|
|
16
16
|
/** How many low-frequency spectrum bands contribute to energy (sub-bass + bass) */
|
|
17
17
|
bassEndIndex?: number;
|
|
18
18
|
}
|
|
19
|
+
export interface TempoEstimate {
|
|
20
|
+
bpm: number;
|
|
21
|
+
periodFrames: number;
|
|
22
|
+
phaseFrame: number;
|
|
23
|
+
/** Beat times in seconds from the start of the analyzed audio. */
|
|
24
|
+
beatsSec?: number[];
|
|
25
|
+
}
|
|
26
|
+
export declare const MIN_TEMPO_BPM = 70;
|
|
27
|
+
export declare const MAX_TEMPO_BPM = 180;
|
|
28
|
+
export declare const PREFERRED_TEMPO_BPM_MIN = 90;
|
|
29
|
+
export declare const PREFERRED_TEMPO_BPM_MAX = 160;
|
|
30
|
+
export declare const DEFAULT_BASS_END_INDEX = 8;
|
|
31
|
+
/** Longest PCM window passed to music-tempo (seconds), taken from the start of the audio. */
|
|
32
|
+
export declare const MAX_TEMPO_ANALYSIS_SECONDS = 90;
|
|
33
|
+
export declare const frameBassEnergy: (spectrum: number[], bassEndIndex?: number) => number;
|
|
19
34
|
export declare const createBeatDetector: (fps: number, options?: BeatDetectorOptions | undefined) => (spectrum: number[]) => BeatInfo;
|
|
35
|
+
export declare const estimateTempo: (samples: ArrayLike<number>, sampleRate: number, fps: number) => TempoEstimate | null;
|
|
36
|
+
export declare const shiftTempoPhase: (tempo: TempoEstimate, startFrame: number) => TempoEstimate;
|
|
37
|
+
/** Beat-grid phase for a later audio window, using in-window beat times when available. */
|
|
38
|
+
export declare const tempoForWindow: (tempo: TempoEstimate, startFrame: number, fps: number, windowFrames?: number | undefined, localOnsetFrames?: number[] | undefined) => TempoEstimate;
|
|
39
|
+
export declare const beatGridFrameIndices: (tempo: Pick<TempoEstimate, "periodFrames" | "phaseFrame">, totalFrames: number, stride?: number) => number[];
|
package/dist/beats.js
CHANGED
|
@@ -1,18 +1,53 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __assign = (this && this.__assign) || function () {
|
|
3
|
+
__assign = Object.assign || function(t) {
|
|
4
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
5
|
+
s = arguments[i];
|
|
6
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
7
|
+
t[p] = s[p];
|
|
8
|
+
}
|
|
9
|
+
return t;
|
|
10
|
+
};
|
|
11
|
+
return __assign.apply(this, arguments);
|
|
12
|
+
};
|
|
13
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
14
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
15
|
+
};
|
|
2
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
var music_tempo_1 = __importDefault(require("music-tempo"));
|
|
18
|
+
exports.MIN_TEMPO_BPM = 70;
|
|
19
|
+
exports.MAX_TEMPO_BPM = 180;
|
|
20
|
+
exports.PREFERRED_TEMPO_BPM_MIN = 90;
|
|
21
|
+
exports.PREFERRED_TEMPO_BPM_MAX = 160;
|
|
22
|
+
exports.DEFAULT_BASS_END_INDEX = 8;
|
|
23
|
+
/** Longest PCM window passed to music-tempo (seconds), taken from the start of the audio. */
|
|
24
|
+
exports.MAX_TEMPO_ANALYSIS_SECONDS = 90;
|
|
25
|
+
var TEMPO_TIME_STEP = 0.01;
|
|
26
|
+
exports.frameBassEnergy = function (spectrum, bassEndIndex) {
|
|
27
|
+
if (bassEndIndex === void 0) { bassEndIndex = exports.DEFAULT_BASS_END_INDEX; }
|
|
28
|
+
var end = Math.min(bassEndIndex, spectrum.length);
|
|
29
|
+
if (end <= 0) {
|
|
30
|
+
return 0;
|
|
31
|
+
}
|
|
32
|
+
var sum = 0;
|
|
33
|
+
for (var i = 0; i < end; i++) {
|
|
34
|
+
var v = spectrum[i];
|
|
35
|
+
sum += v * v;
|
|
36
|
+
}
|
|
37
|
+
return sum / end;
|
|
38
|
+
};
|
|
3
39
|
exports.createBeatDetector = function (fps, options) {
|
|
4
40
|
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
|
|
5
41
|
var historySize = (_b = (_a = options) === null || _a === void 0 ? void 0 : _a.historySize, (_b !== null && _b !== void 0 ? _b : Math.round(fps * 1.5)));
|
|
6
42
|
var thresholdMultiplier = (_d = (_c = options) === null || _c === void 0 ? void 0 : _c.thresholdMultiplier, (_d !== null && _d !== void 0 ? _d : 1.4));
|
|
7
43
|
var decayRate = (_f = (_e = options) === null || _e === void 0 ? void 0 : _e.decayRate, (_f !== null && _f !== void 0 ? _f : 0.85));
|
|
8
44
|
var cooldownFrames = (_h = (_g = options) === null || _g === void 0 ? void 0 : _g.cooldownFrames, (_h !== null && _h !== void 0 ? _h : Math.round(fps * 0.15)));
|
|
9
|
-
var bassEndIndex = (_k = (_j = options) === null || _j === void 0 ? void 0 : _j.bassEndIndex, (_k !== null && _k !== void 0 ? _k :
|
|
45
|
+
var bassEndIndex = (_k = (_j = options) === null || _j === void 0 ? void 0 : _j.bassEndIndex, (_k !== null && _k !== void 0 ? _k : exports.DEFAULT_BASS_END_INDEX));
|
|
10
46
|
var energyHistory = [];
|
|
11
47
|
var framesSinceLastBeat = cooldownFrames;
|
|
12
48
|
var decayingIntensity = 0;
|
|
13
49
|
return function (spectrum) {
|
|
14
|
-
var
|
|
15
|
-
var energy = bassSpectrum.reduce(function (sum, val) { return sum + val * val; }, 0) / bassSpectrum.length;
|
|
50
|
+
var energy = exports.frameBassEnergy(spectrum, bassEndIndex);
|
|
16
51
|
energyHistory.push(energy);
|
|
17
52
|
if (energyHistory.length > historySize) {
|
|
18
53
|
energyHistory.shift();
|
|
@@ -41,4 +76,146 @@ exports.createBeatDetector = function (fps, options) {
|
|
|
41
76
|
};
|
|
42
77
|
};
|
|
43
78
|
};
|
|
79
|
+
var foldTempoBpm = function (bpm) {
|
|
80
|
+
var folded = bpm;
|
|
81
|
+
while (folded > exports.MAX_TEMPO_BPM && folded / 2 >= exports.MIN_TEMPO_BPM) {
|
|
82
|
+
folded /= 2;
|
|
83
|
+
}
|
|
84
|
+
while (folded < exports.MIN_TEMPO_BPM && folded * 2 <= exports.MAX_TEMPO_BPM) {
|
|
85
|
+
folded *= 2;
|
|
86
|
+
}
|
|
87
|
+
return folded;
|
|
88
|
+
};
|
|
89
|
+
var samplesToArray = function (samples, maxLength) {
|
|
90
|
+
var n = Math.min(samples.length, maxLength);
|
|
91
|
+
if (Array.isArray(samples) && n === samples.length) {
|
|
92
|
+
return samples;
|
|
93
|
+
}
|
|
94
|
+
var audioData = new Array(n);
|
|
95
|
+
for (var i = 0; i < n; i++) {
|
|
96
|
+
audioData[i] = samples[i];
|
|
97
|
+
}
|
|
98
|
+
return audioData;
|
|
99
|
+
};
|
|
100
|
+
var wrapIntoPeriod = function (value, period) {
|
|
101
|
+
if (!(period > 0) || !isFinite(value)) {
|
|
102
|
+
return 0;
|
|
103
|
+
}
|
|
104
|
+
var wrapped = value - period * Math.floor(value / period);
|
|
105
|
+
if (wrapped < 0) {
|
|
106
|
+
wrapped += period;
|
|
107
|
+
}
|
|
108
|
+
if (wrapped >= period) {
|
|
109
|
+
wrapped = 0;
|
|
110
|
+
}
|
|
111
|
+
return wrapped;
|
|
112
|
+
};
|
|
113
|
+
var circularMeanPhase = function (frames, period) {
|
|
114
|
+
if (!(period > 0) || frames.length === 0) {
|
|
115
|
+
return 0;
|
|
116
|
+
}
|
|
117
|
+
var sinSum = 0;
|
|
118
|
+
var cosSum = 0;
|
|
119
|
+
for (var _i = 0, frames_1 = frames; _i < frames_1.length; _i++) {
|
|
120
|
+
var frame = frames_1[_i];
|
|
121
|
+
var angle = (2 * Math.PI * frame) / period;
|
|
122
|
+
sinSum += Math.sin(angle);
|
|
123
|
+
cosSum += Math.cos(angle);
|
|
124
|
+
}
|
|
125
|
+
var phase = Math.atan2(sinSum, cosSum) * period / (2 * Math.PI);
|
|
126
|
+
return wrapIntoPeriod(phase, period);
|
|
127
|
+
};
|
|
128
|
+
exports.estimateTempo = function (samples, sampleRate, fps) {
|
|
129
|
+
var _a;
|
|
130
|
+
if (!samples || samples.length === 0 || !(sampleRate > 0) || !(fps > 0)) {
|
|
131
|
+
return null;
|
|
132
|
+
}
|
|
133
|
+
var maxSamples = Math.max(1, Math.floor(sampleRate * exports.MAX_TEMPO_ANALYSIS_SECONDS));
|
|
134
|
+
var audioData = samplesToArray(samples, maxSamples);
|
|
135
|
+
var hopSize = Math.max(1, Math.round(sampleRate * TEMPO_TIME_STEP));
|
|
136
|
+
try {
|
|
137
|
+
var mt = new music_tempo_1.default(audioData, {
|
|
138
|
+
hopSize: hopSize,
|
|
139
|
+
timeStep: TEMPO_TIME_STEP,
|
|
140
|
+
minBeatInterval: 60 / exports.MAX_TEMPO_BPM,
|
|
141
|
+
maxBeatInterval: 60 / exports.MIN_TEMPO_BPM,
|
|
142
|
+
});
|
|
143
|
+
var beatInterval = Number(mt.beatInterval);
|
|
144
|
+
var bpm = Number(mt.tempo);
|
|
145
|
+
if (!(bpm > 0) && beatInterval > 0) {
|
|
146
|
+
bpm = 60 / beatInterval;
|
|
147
|
+
}
|
|
148
|
+
if (!(bpm > 0)) {
|
|
149
|
+
return null;
|
|
150
|
+
}
|
|
151
|
+
bpm = foldTempoBpm(bpm);
|
|
152
|
+
if (bpm < exports.MIN_TEMPO_BPM * 0.9 || bpm > exports.MAX_TEMPO_BPM * 1.1) {
|
|
153
|
+
return null;
|
|
154
|
+
}
|
|
155
|
+
var periodFrames = fps * 60 / bpm;
|
|
156
|
+
var beatsSec = (_a = mt.beats, (_a !== null && _a !== void 0 ? _a : []))
|
|
157
|
+
.map(function (t) { return Number(t); })
|
|
158
|
+
.filter(function (t) { return t >= 0 && isFinite(t); });
|
|
159
|
+
var beatFrames = beatsSec.map(function (t) { return t * fps; });
|
|
160
|
+
var phaseFrame = beatFrames.length > 0
|
|
161
|
+
? wrapIntoPeriod(circularMeanPhase(beatFrames, periodFrames), periodFrames)
|
|
162
|
+
: 0;
|
|
163
|
+
return __assign({ bpm: Math.round(bpm), periodFrames: periodFrames,
|
|
164
|
+
phaseFrame: phaseFrame }, (beatsSec.length > 0 ? { beatsSec: beatsSec } : {}));
|
|
165
|
+
}
|
|
166
|
+
catch (_b) {
|
|
167
|
+
return null;
|
|
168
|
+
}
|
|
169
|
+
};
|
|
170
|
+
exports.shiftTempoPhase = function (tempo, startFrame) {
|
|
171
|
+
var period = tempo.periodFrames;
|
|
172
|
+
if (!(period > 0) || startFrame === 0) {
|
|
173
|
+
return tempo;
|
|
174
|
+
}
|
|
175
|
+
return __assign(__assign({}, tempo), { phaseFrame: wrapIntoPeriod(tempo.phaseFrame - startFrame, period) });
|
|
176
|
+
};
|
|
177
|
+
/** Beat-grid phase for a later audio window, using in-window beat times when available. */
|
|
178
|
+
exports.tempoForWindow = function (tempo, startFrame, fps, windowFrames, localOnsetFrames) {
|
|
179
|
+
var _a;
|
|
180
|
+
var period = tempo.periodFrames;
|
|
181
|
+
if (!(period > 0) || !(fps > 0)) {
|
|
182
|
+
return tempo;
|
|
183
|
+
}
|
|
184
|
+
var startSec = startFrame / fps;
|
|
185
|
+
var endSec = windowFrames != null && windowFrames >= 0
|
|
186
|
+
? (startFrame + windowFrames) / fps
|
|
187
|
+
: Number.POSITIVE_INFINITY;
|
|
188
|
+
var inWindow = (_a = tempo.beatsSec, (_a !== null && _a !== void 0 ? _a : [])).filter(function (t) { return t >= startSec && t < endSec; });
|
|
189
|
+
if (inWindow.length > 0) {
|
|
190
|
+
var localFrames = inWindow.map(function (t) { return (t - startSec) * fps; });
|
|
191
|
+
return __assign(__assign({}, tempo), { phaseFrame: wrapIntoPeriod(circularMeanPhase(localFrames, period), period) });
|
|
192
|
+
}
|
|
193
|
+
var onsets = ((localOnsetFrames !== null && localOnsetFrames !== void 0 ? localOnsetFrames : [])).filter(function (frame) {
|
|
194
|
+
return frame > 0 && (windowFrames == null || frame < windowFrames);
|
|
195
|
+
});
|
|
196
|
+
if (onsets.length > 0) {
|
|
197
|
+
return __assign(__assign({}, tempo), { phaseFrame: wrapIntoPeriod(circularMeanPhase(onsets, period), period) });
|
|
198
|
+
}
|
|
199
|
+
return exports.shiftTempoPhase(tempo, startFrame);
|
|
200
|
+
};
|
|
201
|
+
exports.beatGridFrameIndices = function (tempo, totalFrames, stride) {
|
|
202
|
+
if (stride === void 0) { stride = 1; }
|
|
203
|
+
var period = tempo.periodFrames;
|
|
204
|
+
var step = Math.max(1, Math.round(stride));
|
|
205
|
+
if (!(period > 0) || totalFrames <= 1) {
|
|
206
|
+
return [];
|
|
207
|
+
}
|
|
208
|
+
var frames = [];
|
|
209
|
+
var nStart = tempo.phaseFrame > 0 ? 0 : 1;
|
|
210
|
+
for (var n = nStart;; n += step) {
|
|
211
|
+
var frame = Math.round(tempo.phaseFrame + n * period);
|
|
212
|
+
if (frame >= totalFrames) {
|
|
213
|
+
break;
|
|
214
|
+
}
|
|
215
|
+
if (frame > 0) {
|
|
216
|
+
frames.push(frame);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
return frames;
|
|
220
|
+
};
|
|
44
221
|
//# sourceMappingURL=beats.js.map
|
package/dist/beats.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"beats.js","sourceRoot":"","sources":["../src/beats.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"beats.js","sourceRoot":"","sources":["../src/beats.ts"],"names":[],"mappings":"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"}
|
package/dist/highlight.d.ts
CHANGED
|
@@ -14,6 +14,7 @@ export interface HighlightRun {
|
|
|
14
14
|
highlightFrames: number;
|
|
15
15
|
spectrums: number[][];
|
|
16
16
|
beatFrameIndices: number[];
|
|
17
|
+
beatIntensities: number[];
|
|
17
18
|
audioSegment: HighlightAudioSegment;
|
|
18
19
|
}
|
|
19
20
|
/**
|
|
@@ -25,6 +26,7 @@ export declare function computeHighlightSlice(fps: number, totalFrames: number,
|
|
|
25
26
|
highlightFrames: number;
|
|
26
27
|
spectrums: number[][];
|
|
27
28
|
beatFrameIndices: number[];
|
|
29
|
+
beatIntensities: number[];
|
|
28
30
|
audioSeekSeconds: number;
|
|
29
31
|
audioDurationSeconds: number;
|
|
30
32
|
audioSegments: HighlightAudioSegment[];
|
package/dist/highlight.js
CHANGED
|
@@ -42,16 +42,17 @@ exports.HIGHLIGHT_DURATION_SEC = 15;
|
|
|
42
42
|
function buildHighlightRun(fps, seg, spectrums, beatEvents) {
|
|
43
43
|
var startFrame = seg.startFrame, highlightFrames = seg.highlightFrames;
|
|
44
44
|
var spectrumsSlice = spectrums.slice(startFrame, startFrame + highlightFrames);
|
|
45
|
-
var
|
|
46
|
-
.
|
|
47
|
-
.
|
|
48
|
-
|
|
49
|
-
|
|
45
|
+
var beatsInWindow = beatEvents
|
|
46
|
+
.filter(function (b) { return b.frameIndex >= startFrame && b.frameIndex < startFrame + highlightFrames; })
|
|
47
|
+
.sort(function (a, b) { return a.frameIndex - b.frameIndex; });
|
|
48
|
+
var beatFrameIndices = beatsInWindow.map(function (b) { return b.frameIndex - startFrame; });
|
|
49
|
+
var beatIntensities = beatsInWindow.map(function (b) { return b.intensity; });
|
|
50
50
|
return {
|
|
51
51
|
startFrame: startFrame,
|
|
52
52
|
highlightFrames: highlightFrames,
|
|
53
53
|
spectrums: spectrumsSlice,
|
|
54
54
|
beatFrameIndices: beatFrameIndices,
|
|
55
|
+
beatIntensities: beatIntensities,
|
|
55
56
|
audioSegment: {
|
|
56
57
|
seekSeconds: startFrame / fps,
|
|
57
58
|
durationSeconds: highlightFrames / fps,
|
|
@@ -221,9 +222,9 @@ function computeHighlightSlice(fps, totalFrames, spectrums, beatEvents, segmentC
|
|
|
221
222
|
if (segmentCount === void 0) { segmentCount = 1; }
|
|
222
223
|
var _a, _b, _c;
|
|
223
224
|
return __awaiter(this, void 0, void 0, function () {
|
|
224
|
-
var highlightFramesTarget, audioSegments_1, fullSeg, highlightFrames, energies, excludeRanges, rawSegments, n, k, startFrame, runs, slicedSpectrums, beatFrameIndices, outOffset, _i, rawSegments_1, seg,
|
|
225
|
-
return __generator(this, function (
|
|
226
|
-
switch (
|
|
225
|
+
var highlightFramesTarget, audioSegments_1, fullSeg, fullRun, highlightFrames, energies, excludeRanges, rawSegments, n, k, startFrame, runs, slicedSpectrums, beatFrameIndices, beatIntensities, outOffset, _loop_1, _i, rawSegments_1, seg, totalHighlightFrames, audioSegments, first;
|
|
226
|
+
return __generator(this, function (_d) {
|
|
227
|
+
switch (_d.label) {
|
|
227
228
|
case 0:
|
|
228
229
|
highlightFramesTarget = Math.ceil(exports.HIGHLIGHT_DURATION_SEC * fps);
|
|
229
230
|
if (totalFrames <= 0) {
|
|
@@ -232,6 +233,7 @@ function computeHighlightSlice(fps, totalFrames, spectrums, beatEvents, segmentC
|
|
|
232
233
|
highlightFrames: 0,
|
|
233
234
|
spectrums: [],
|
|
234
235
|
beatFrameIndices: [],
|
|
236
|
+
beatIntensities: [],
|
|
235
237
|
audioSeekSeconds: 0,
|
|
236
238
|
audioDurationSeconds: 0,
|
|
237
239
|
audioSegments: [],
|
|
@@ -246,37 +248,39 @@ function computeHighlightSlice(fps, totalFrames, spectrums, beatEvents, segmentC
|
|
|
246
248
|
},
|
|
247
249
|
];
|
|
248
250
|
fullSeg = { startFrame: 0, highlightFrames: totalFrames };
|
|
251
|
+
fullRun = buildHighlightRun(fps, fullSeg, spectrums, beatEvents);
|
|
249
252
|
return [2 /*return*/, {
|
|
250
253
|
startFrame: 0,
|
|
251
254
|
highlightFrames: totalFrames,
|
|
252
255
|
spectrums: spectrums.slice(),
|
|
253
|
-
beatFrameIndices:
|
|
256
|
+
beatFrameIndices: fullRun.beatFrameIndices,
|
|
257
|
+
beatIntensities: fullRun.beatIntensities,
|
|
254
258
|
audioSeekSeconds: 0,
|
|
255
259
|
audioDurationSeconds: totalFrames / fps,
|
|
256
260
|
audioSegments: audioSegments_1,
|
|
257
|
-
runs: [
|
|
261
|
+
runs: [fullRun],
|
|
258
262
|
}];
|
|
259
263
|
}
|
|
260
264
|
highlightFrames = highlightFramesTarget;
|
|
261
265
|
return [4 /*yield*/, buildFrameEnergies(spectrums, totalFrames)];
|
|
262
266
|
case 1:
|
|
263
|
-
energies =
|
|
267
|
+
energies = _d.sent();
|
|
264
268
|
excludeRanges = [];
|
|
265
269
|
rawSegments = [];
|
|
266
270
|
n = Math.max(1, Math.floor(segmentCount));
|
|
267
271
|
k = 0;
|
|
268
|
-
|
|
272
|
+
_d.label = 2;
|
|
269
273
|
case 2:
|
|
270
274
|
if (!(k < n)) return [3 /*break*/, 5];
|
|
271
275
|
return [4 /*yield*/, findBestHighlightStart(energies, totalFrames, highlightFrames, excludeRanges)];
|
|
272
276
|
case 3:
|
|
273
|
-
startFrame =
|
|
277
|
+
startFrame = _d.sent();
|
|
274
278
|
if (startFrame === null) {
|
|
275
279
|
return [3 /*break*/, 5];
|
|
276
280
|
}
|
|
277
281
|
rawSegments.push({ startFrame: startFrame, highlightFrames: highlightFrames });
|
|
278
282
|
excludeRanges.push({ start: startFrame, endExclusive: startFrame + highlightFrames });
|
|
279
|
-
|
|
283
|
+
_d.label = 4;
|
|
280
284
|
case 4:
|
|
281
285
|
k++;
|
|
282
286
|
return [3 /*break*/, 2];
|
|
@@ -287,21 +291,25 @@ function computeHighlightSlice(fps, totalFrames, spectrums, beatEvents, segmentC
|
|
|
287
291
|
});
|
|
288
292
|
slicedSpectrums = [];
|
|
289
293
|
beatFrameIndices = [];
|
|
294
|
+
beatIntensities = [];
|
|
290
295
|
outOffset = 0;
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
chunk = spectrums.slice(seg.startFrame, seg.startFrame + seg.highlightFrames);
|
|
296
|
+
_loop_1 = function (seg) {
|
|
297
|
+
var chunk = spectrums.slice(seg.startFrame, seg.startFrame + seg.highlightFrames);
|
|
294
298
|
slicedSpectrums.push.apply(slicedSpectrums, chunk);
|
|
295
|
-
|
|
296
|
-
b
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
299
|
+
var beatsInSeg = beatEvents
|
|
300
|
+
.filter(function (b) { return b.frameIndex >= seg.startFrame && b.frameIndex < seg.startFrame + seg.highlightFrames; })
|
|
301
|
+
.sort(function (a, b) { return a.frameIndex - b.frameIndex; });
|
|
302
|
+
for (var _i = 0, beatsInSeg_1 = beatsInSeg; _i < beatsInSeg_1.length; _i++) {
|
|
303
|
+
var b = beatsInSeg_1[_i];
|
|
304
|
+
beatFrameIndices.push(b.frameIndex - seg.startFrame + outOffset);
|
|
305
|
+
beatIntensities.push(b.intensity);
|
|
301
306
|
}
|
|
302
307
|
outOffset += seg.highlightFrames;
|
|
308
|
+
};
|
|
309
|
+
for (_i = 0, rawSegments_1 = rawSegments; _i < rawSegments_1.length; _i++) {
|
|
310
|
+
seg = rawSegments_1[_i];
|
|
311
|
+
_loop_1(seg);
|
|
303
312
|
}
|
|
304
|
-
beatFrameIndices.sort(function (a, b) { return a - b; });
|
|
305
313
|
totalHighlightFrames = slicedSpectrums.length;
|
|
306
314
|
audioSegments = rawSegments.map(function (seg) { return ({
|
|
307
315
|
seekSeconds: seg.startFrame / fps,
|
|
@@ -313,6 +321,7 @@ function computeHighlightSlice(fps, totalFrames, spectrums, beatEvents, segmentC
|
|
|
313
321
|
highlightFrames: totalHighlightFrames,
|
|
314
322
|
spectrums: slicedSpectrums,
|
|
315
323
|
beatFrameIndices: beatFrameIndices,
|
|
324
|
+
beatIntensities: beatIntensities,
|
|
316
325
|
audioSeekSeconds: first.seekSeconds,
|
|
317
326
|
audioDurationSeconds: first.durationSeconds,
|
|
318
327
|
audioSegments: audioSegments,
|
package/dist/highlight.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"highlight.js","sourceRoot":"","sources":["../src/highlight.ts"],"names":[],"mappings":";AAAA,8EAA8E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAE9E,uDAAsD;AAEzC,QAAA,sBAAsB,GAAG,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"highlight.js","sourceRoot":"","sources":["../src/highlight.ts"],"names":[],"mappings":"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"}
|
package/dist/image.d.ts
CHANGED
|
@@ -76,4 +76,17 @@ export declare const invertColor: (color: Color) => {
|
|
|
76
76
|
green: number;
|
|
77
77
|
blue: number;
|
|
78
78
|
};
|
|
79
|
+
/** Pixel shift strength for the cut frame and the frames after it. */
|
|
80
|
+
export declare const CUT_SHAKE_AMPLITUDE_BY_OFFSET: readonly [14, 9, 5, 3, 1];
|
|
81
|
+
export declare const CUT_SHAKE_PEAK_AMPLITUDE = 14;
|
|
82
|
+
export declare const MIN_CUT_SHAKE_FRAMES = 3;
|
|
83
|
+
export declare const SHAKE_DURATION_BEAT_FRACTION: number;
|
|
84
|
+
/** Camera shake fires on every Nth beat of the tempo grid (half a bar of 4/4). */
|
|
85
|
+
export declare const CAMERA_SHAKE_EVERY_BEATS = 2;
|
|
86
|
+
export declare const buildCutShakeAmplitudes: (periodFrames: number) => number[];
|
|
87
|
+
export declare const getCutShakeOffset: (frameIndex: number, cutFrames: ReadonlySet<number>, amplitudes?: readonly number[]) => {
|
|
88
|
+
x: number;
|
|
89
|
+
y: number;
|
|
90
|
+
};
|
|
91
|
+
export declare const applyCameraShake: (imageDstBuffer: EncodedBmp, width: number, height: number, offsetX: number, offsetY: number) => void;
|
|
79
92
|
export {};
|
package/dist/image.js
CHANGED
|
@@ -450,6 +450,86 @@ exports.getVideoFrameColor = function (bgrBuffer, width, height) {
|
|
|
450
450
|
exports.invertColor = function (color) {
|
|
451
451
|
return ({ red: 255 - color.red, green: 255 - color.green, blue: 255 - color.blue });
|
|
452
452
|
};
|
|
453
|
+
/** Pixel shift strength for the cut frame and the frames after it. */
|
|
454
|
+
exports.CUT_SHAKE_AMPLITUDE_BY_OFFSET = [14, 9, 5, 3, 1];
|
|
455
|
+
exports.CUT_SHAKE_PEAK_AMPLITUDE = 14;
|
|
456
|
+
exports.MIN_CUT_SHAKE_FRAMES = 3;
|
|
457
|
+
exports.SHAKE_DURATION_BEAT_FRACTION = 1 / 3;
|
|
458
|
+
/** Camera shake fires on every Nth beat of the tempo grid (half a bar of 4/4). */
|
|
459
|
+
exports.CAMERA_SHAKE_EVERY_BEATS = 2;
|
|
460
|
+
exports.buildCutShakeAmplitudes = function (periodFrames) {
|
|
461
|
+
if (!(periodFrames > 0)) {
|
|
462
|
+
return Array.from(exports.CUT_SHAKE_AMPLITUDE_BY_OFFSET);
|
|
463
|
+
}
|
|
464
|
+
var frameCount = Math.max(exports.MIN_CUT_SHAKE_FRAMES, Math.round(periodFrames * exports.SHAKE_DURATION_BEAT_FRACTION));
|
|
465
|
+
if (frameCount === 1) {
|
|
466
|
+
return [exports.CUT_SHAKE_PEAK_AMPLITUDE];
|
|
467
|
+
}
|
|
468
|
+
var decayTo = 1 / exports.CUT_SHAKE_PEAK_AMPLITUDE;
|
|
469
|
+
var amplitudes = [];
|
|
470
|
+
for (var i = 0; i < frameCount; i++) {
|
|
471
|
+
var t = i / (frameCount - 1);
|
|
472
|
+
amplitudes.push(Math.max(1, Math.round(exports.CUT_SHAKE_PEAK_AMPLITUDE * Math.pow(decayTo, t))));
|
|
473
|
+
}
|
|
474
|
+
return amplitudes;
|
|
475
|
+
};
|
|
476
|
+
var clampInt = function (value, min, max) {
|
|
477
|
+
if (value < min) {
|
|
478
|
+
return min;
|
|
479
|
+
}
|
|
480
|
+
if (value > max) {
|
|
481
|
+
return max;
|
|
482
|
+
}
|
|
483
|
+
return value;
|
|
484
|
+
};
|
|
485
|
+
exports.getCutShakeOffset = function (frameIndex, cutFrames, amplitudes) {
|
|
486
|
+
if (amplitudes === void 0) { amplitudes = exports.CUT_SHAKE_AMPLITUDE_BY_OFFSET; }
|
|
487
|
+
if (amplitudes.length === 0) {
|
|
488
|
+
return { x: 0, y: 0 };
|
|
489
|
+
}
|
|
490
|
+
var framesAfterCut = -1;
|
|
491
|
+
var originCut = -1;
|
|
492
|
+
for (var offset = 0; offset < amplitudes.length; offset++) {
|
|
493
|
+
var cut = frameIndex - offset;
|
|
494
|
+
if (cutFrames.has(cut) && (framesAfterCut === -1 || offset < framesAfterCut)) {
|
|
495
|
+
framesAfterCut = offset;
|
|
496
|
+
originCut = cut;
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
if (framesAfterCut === -1) {
|
|
500
|
+
return { x: 0, y: 0 };
|
|
501
|
+
}
|
|
502
|
+
var amplitude = amplitudes[framesAfterCut];
|
|
503
|
+
var angle = originCut * 2.399 + framesAfterCut * 2.1;
|
|
504
|
+
return {
|
|
505
|
+
x: Math.round(Math.cos(angle) * amplitude),
|
|
506
|
+
y: Math.round(Math.sin(angle) * amplitude),
|
|
507
|
+
};
|
|
508
|
+
};
|
|
509
|
+
exports.applyCameraShake = function (imageDstBuffer, width, height, offsetX, offsetY) {
|
|
510
|
+
var ox = Math.round(offsetX);
|
|
511
|
+
var oy = Math.round(offsetY);
|
|
512
|
+
if (ox === 0 && oy === 0) {
|
|
513
|
+
return;
|
|
514
|
+
}
|
|
515
|
+
var shiftPos = imageDstBuffer.shiftPos, rowBytes = imageDstBuffer.rowBytes, data = imageDstBuffer.data;
|
|
516
|
+
var pixelBytes = height * rowBytes;
|
|
517
|
+
var sourcePixels = Buffer.allocUnsafe(pixelBytes);
|
|
518
|
+
data.copy(sourcePixels, 0, shiftPos, shiftPos + pixelBytes);
|
|
519
|
+
for (var y = 0; y < height; y++) {
|
|
520
|
+
var srcY = clampInt(y - oy, 0, height - 1);
|
|
521
|
+
var dstRow = shiftPos + y * rowBytes;
|
|
522
|
+
var srcRow = srcY * rowBytes;
|
|
523
|
+
for (var x = 0; x < width; x++) {
|
|
524
|
+
var srcX = clampInt(x - ox, 0, width - 1);
|
|
525
|
+
var dstIndex = dstRow + x * 3;
|
|
526
|
+
var srcIndex = srcRow + srcX * 3;
|
|
527
|
+
data[dstIndex] = sourcePixels[srcIndex];
|
|
528
|
+
data[dstIndex + 1] = sourcePixels[srcIndex + 1];
|
|
529
|
+
data[dstIndex + 2] = sourcePixels[srcIndex + 2];
|
|
530
|
+
}
|
|
531
|
+
}
|
|
532
|
+
};
|
|
453
533
|
var hexToRgb = function (hex) {
|
|
454
534
|
var red = parseInt(hex.substring(1, 3), 16);
|
|
455
535
|
var green = parseInt(hex.substring(3, 5), 16);
|