90 lines
3.0 KiB
JavaScript
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;
|