79 lines
2.7 KiB
JavaScript
79 lines
2.7 KiB
JavaScript
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.createVideoEncoder = void 0;
|
|
const media_parser_1 = require("@remotion/media-parser");
|
|
const convert_to_correct_videoframe_1 = require("./convert-to-correct-videoframe");
|
|
const io_synchronizer_1 = require("./io-manager/io-synchronizer");
|
|
const log_1 = require("./log");
|
|
const createVideoEncoder = ({ onChunk, onError, controller, config, logLevel, outputCodec, keyframeInterval, }) => {
|
|
if (controller._internals._mediaParserController._internals.signal.aborted) {
|
|
throw new media_parser_1.MediaParserAbortError('Not creating video encoder, already aborted');
|
|
}
|
|
const ioSynchronizer = (0, io_synchronizer_1.makeIoSynchronizer)({
|
|
logLevel,
|
|
label: 'Video encoder',
|
|
controller,
|
|
});
|
|
const encoder = new VideoEncoder({
|
|
error(error) {
|
|
onError(error);
|
|
},
|
|
async output(chunk, metadata) {
|
|
const timestamp = chunk.timestamp + (chunk.duration ?? 0);
|
|
try {
|
|
await onChunk(chunk, metadata ?? null);
|
|
}
|
|
catch (err) {
|
|
onError(err);
|
|
}
|
|
ioSynchronizer.onOutput(timestamp);
|
|
},
|
|
});
|
|
const close = () => {
|
|
controller._internals._mediaParserController._internals.signal.removeEventListener('abort',
|
|
// eslint-disable-next-line @typescript-eslint/no-use-before-define
|
|
onAbort);
|
|
if (encoder.state === 'closed') {
|
|
return;
|
|
}
|
|
encoder.close();
|
|
};
|
|
const onAbort = () => {
|
|
close();
|
|
};
|
|
controller._internals._mediaParserController._internals.signal.addEventListener('abort', onAbort);
|
|
log_1.Log.verbose(logLevel, 'Configuring video encoder', config);
|
|
encoder.configure(config);
|
|
let framesProcessed = 0;
|
|
const encodeFrame = (frame) => {
|
|
if (encoder.state === 'closed') {
|
|
return;
|
|
}
|
|
const keyFrame = framesProcessed % keyframeInterval === 0;
|
|
encoder.encode((0, convert_to_correct_videoframe_1.convertToCorrectVideoFrame)({ videoFrame: frame, outputCodec }), {
|
|
keyFrame,
|
|
// @ts-expect-error
|
|
vp9: {
|
|
quantizer: 36,
|
|
},
|
|
});
|
|
ioSynchronizer.inputItem(frame.timestamp);
|
|
framesProcessed++;
|
|
};
|
|
return {
|
|
encode: (frame) => {
|
|
encodeFrame(frame);
|
|
},
|
|
waitForFinish: async () => {
|
|
await encoder.flush();
|
|
await ioSynchronizer.waitForQueueSize(0);
|
|
},
|
|
close,
|
|
flush: async () => {
|
|
await encoder.flush();
|
|
},
|
|
ioSynchronizer,
|
|
};
|
|
};
|
|
exports.createVideoEncoder = createVideoEncoder;
|