1.2.4 • Published 5 years ago
pcm-resampler v1.2.4
Resampler
Resampler with WebAssembly.
Usage
Constructor
import Resampler from 'pcm-resampler';
/**
* init resampler
* @param { string } workerUrl worker url, no cross domain usually
* @param { number } sampleRate target sample rate
* @param { (chunk: Uint8Array) => void } onDataHandler resampler data callback
* @param { Object } options config
*/
var resampler = new Resampler(workerUrl, sampleRate, onDataHandler, options);
options
option, config settings.
originalSampleRate
number, origin resample rate, default is the resample rate of browser context.
Methods
/**
* init
* @return { promise }
*/
resampler.init();
/**
* append data
* @param { Float32Array[] } buffers origin data, order by channel order, like: [0] channel1, [1] channel2
*/
resampler.feed(buffers);
/**
* stop resampler
*/
resampler.destroy();
Example
Usually, the resampleWorker.min.js
, resampleWorker.min.wasm
in dist folder need publish on the same domain for dynamic load.
// create resampler
const resampler = new Resampler(
'/public/worker/resampleWorer.min.js', // worker url, same domain
16000, // 16KHz target sample rate
(chunk: Uint8Array) => {
// !!!chuck is the data after resampler to 16kHz
},
);
// init
await resample.init();
// feed data
resample.feed(buffers);
// buffers can be generate from AudioBuffer
// like:
/**
const buffers: Float32Array[] = [];
for (let i = 0; i < audioBuffer.numberOfChannels; i++ ) {
buffers[i] = audioBuffer.getChannelData(i);
}
*/
Cross Domain
Worker can cross domain, if your js only publish to cdn domain, you can fetch the Worker text data to load.
Like this:
// resampleWorker.min.js cdn url
const workerUrl = 'http://cdnxxx/resampleWorker.min.js';
// resampleWorker.min.wasm cdn url
const webassemblyUrl = 'http://cdnxxx/resampleWorker.min.wasm';
// download worker text content
const codeString = await fetch(workerUrl).then(res => res.text());
// create local url, and change resampleWorker.min.wasm load url
const localWorkerUrl = window.URL.createObjectURL(new Blob([`
var Module = {
locateFile: function(s) {
return '${webassemblyUrl}';
}
};
${codeString}
`], {
type: 'application/javascript',
}));
// create resampler
const resampler = new Resampler(localWorkerUrl, 16000, () => {});
// init
await resample.init();