@flemist/ffmpeg-encode-decode
Version:
WASM (WebAssembly) encode/decode mp3/ogg/opus/vorbis from/to Float32Array. Well tested @ffmpeg/ffmpeg wrapper.
64 lines (61 loc) • 2.46 kB
JavaScript
import { __awaiter } from 'tslib';
function ffmpegDecode({ ffmpegTransform, inputData, decode: { inputFormat, channels, sampleRate, }, priority, abortSignal, }) {
return __awaiter(this, void 0, void 0, function* () {
const inputFile = 'input' + (inputFormat ? '.' + inputFormat : '');
const outputFile = 'output.pcm';
// decodeInputSize += inputData.byteLength
const outputData = yield ffmpegTransform({
inputData,
inputFile,
outputFile,
params: [
'-i', inputFile,
'-f', 'f32le',
'-ac', channels + '',
'-ar', sampleRate + '',
'-acodec', 'pcm_f32le',
outputFile,
],
priority,
abortSignal,
});
// decodeOutputSize += outputData.byteLength
// decodeCount++
// console.log(`Decode: ${decodeCount}, ${decodeInputSize}, ${decodeOutputSize}`)
return {
data: new Float32Array(outputData.buffer, outputData.byteOffset, outputData.byteLength / 4),
channels,
sampleRate,
};
});
}
function ffmpegEncode({ ffmpegTransform, samples, encode: { outputFormat, channels, params, }, priority, abortSignal, }) {
return __awaiter(this, void 0, void 0, function* () {
const inputFile = 'input.pcm';
const outputFile = 'output' + (outputFormat ? '.' + outputFormat : '');
const pcmData = new Uint8Array(samples.data.buffer, samples.data.byteOffset, samples.data.byteLength);
// encodeInputSize += pcmData.byteLength
// docs: https://trac.ffmpeg.org/wiki/AudioChannelManipulation
const outputData = yield ffmpegTransform({
inputData: pcmData,
inputFile,
outputFile,
params: [
'-f', 'f32le',
'-ac', samples.channels + '',
'-ar', samples.sampleRate + '',
'-i', 'input.pcm',
'-ac', (channels || samples.channels) + '',
...params || [],
outputFile,
],
priority,
abortSignal,
});
// encodeOutputSize += outputData.byteLength
// encodeCount++
// console.log(`Encode: ${encodeCount}, ${encodeInputSize}, ${encodeOutputSize}`)
return outputData;
});
}
export { ffmpegDecode, ffmpegEncode };