1.2.4 • Published 5 years ago

pcm-resampler v1.2.4

Weekly downloads
2
License
MIT
Repository
github
Last release
5 years ago

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();