Files

90 lines
3.0 KiB
JavaScript

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.createAudioEncoder = void 0;
const media_parser_1 = require("@remotion/media-parser");
const io_synchronizer_1 = require("./io-manager/io-synchronizer");
const wav_audio_encoder_1 = require("./wav-audio-encoder");
const createAudioEncoder = ({ onChunk, onError, codec, controller, config: audioEncoderConfig, logLevel, onNewAudioSampleRate, }) => {
if (controller._internals._mediaParserController._internals.signal.aborted) {
throw new media_parser_1.MediaParserAbortError('Not creating audio encoder, already aborted');
}
const ioSynchronizer = (0, io_synchronizer_1.makeIoSynchronizer)({
logLevel,
label: 'Audio encoder',
controller,
});
if (codec === 'wav') {
return (0, wav_audio_encoder_1.getWaveAudioEncoder)({
onChunk,
controller,
config: audioEncoderConfig,
ioSynchronizer,
});
}
const encoder = new AudioEncoder({
output: async (chunk) => {
try {
await onChunk(chunk);
}
catch (err) {
onError(err);
}
ioSynchronizer.onOutput(chunk.timestamp);
},
error(error) {
onError(error);
},
});
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);
if (codec !== 'opus' && codec !== 'aac') {
throw new Error('Only `codec: "opus"` and `codec: "aac"` is supported currently');
}
const wantedSampleRate = audioEncoderConfig.sampleRate;
const encodeFrame = (audioData) => {
if (encoder.state === 'closed') {
return;
}
if (encoder.state === 'unconfigured') {
if (audioData.sampleRate === wantedSampleRate) {
encoder.configure(audioEncoderConfig);
}
else {
encoder.configure({
...audioEncoderConfig,
sampleRate: audioData.sampleRate,
});
onNewAudioSampleRate(audioData.sampleRate);
}
}
encoder.encode(audioData);
ioSynchronizer.inputItem(audioData.timestamp);
};
return {
encode: (audioData) => {
encodeFrame(audioData);
},
waitForFinish: async () => {
await encoder.flush();
await ioSynchronizer.waitForQueueSize(0);
},
close,
flush: async () => {
await encoder.flush();
},
ioSynchronizer,
};
};
exports.createAudioEncoder = createAudioEncoder;