hb9fxq / libopusjs

a libopus API for JavaScript (wasm/asm.js)

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

libopusjs

This project is mostly about having access to the low-level packet encoding/decoding API of libopus in JavaScript.
Opus allow to encode audio without container and can handle packet loss, which makes it very suitable for VoIP over UDP (it also has voice optimizations).

API

// Encoder

// create encoder
// channels: 1-2
// samplerate: 8000,12000,16000,24000,48000
// bitrate: see Opus recommended bitrates
// frame_size: frame size in milliseconds (2.5,5,10,20,40,60), 20 is recommended
// voice_optimization: true/false
Encoder(channels, samplerate, bitrate, frame_size, voice_optimization)

// free encoder memory
Encoder.destroy()

// add samples to the encoder buffer
// samples: Int16Array of interleaved (if multiple channels) samples
Encoder.input(samples)

// output the next encoded packet
// return Uint8Array (valid until the next output call) or null if there is no packet to output
Encoder.output()

// Decoder

// create decoder
// channels and samplerate should match the encoder options
Decoder(channels, samplerate)

// free decoder memory
Decoder.destroy()

// add packet to the decoder buffer
// packet: Uint8Array
Decoder.input(packet)

// output the next decoded samples
// return samples (interleaved if multiple channels) as Int16Array (valid until the next output call) or null if there is no output
Decoder.output()

Loading

ℹ️

You can use the asm.js or wasm version, the WebAssembly is much faster in nodejs/browser than the asm.js version on my computer. asm.js also has limited memory. Since the WebAssembly version will need to load the .wasm file, a url scheme like http is required and the library will be asynchronously loaded. It will load the libopus.wasm file relative to libopus.wasm.js, unless the global LIBOPUS_WASM_URL exists (containing the URL).

libopus.loaded will be true when loaded and libopus.onload will be called if defined. Using asm.js, libopus.onload will probably never be called because it was not yet defined. See examples/test.

Files
asm.js

dist/libopus.asm.js

wasm

dist/libopus.wasm.js dist/libopus.wasm

Usage

Input data to the encoder or the decoder, then loop over the output call until it returns null. A single input can give multiple outputs or none.

// nodejs:
var libopus = require("./libopus.js");

// in browser:
// load the script, libopus will be available as a global

// create encoder
var enc = new libopus.Encoder(1,48000,24000,false);

// create decoder
var dec = new libopus.Decoder(1,48000);

// destroy encoder
enc.destroy();

// destroy decoder
dec.destroy();

About

a libopus API for JavaScript (wasm/asm.js)

License:MIT License


Languages

Language:C++ 60.2%Language:JavaScript 29.0%Language:Shell 10.8%