$ cnpm install opus-encdec
A javascript library to encode and decode Opus (with/without Ogg container) using pure JavaScript and/or WebAssembly.
forked & modified from chris-rudmin/opus-recorder (version 8.0.3)
Main differences to chris-rudmin/opus-recorder:
rawOpus (boolean): encode as raw OPUS frames (instead of OGG container)dist/:
*.js)*.min.js + *.min.mem)*.wasm.js + *.wasm.wasm)*.wasm.min.js + *.wasm.min.wasm)TODO
- test newly supported for
int opus_decoder_ctl ( OpusDecoder * st, OPUS_GET_PITCH( opus_int32 * pitch ) )(OPUS_GET_PITCH_REQUEST 4033) for detecting voice in audio- compile
recorder.js,decoderWorker.jsandencoderWorker.jsinto (single file) minified versions (and wasm-versions)- compile UMD wrapper for
oggOpusDecoder.jsandoggOpusEncoder.js(& minified versions)- make
examples/work out-of-the-box again (work-around: copyrecorder.js,decoderWorker.jsandencoderWorker.jstodist/and/or modified<script src="..."tags in exmple HTML files)
emscripten: v2.0.14 (compiler)
libopus: v1.3.1
speexDSP: v1.2.0
The required files are in the dist folder:
libopus-[encoder | decoder].jslibopus-[encoder | decoder].wasm.jslibopus-[encoder | decoder].wasm.wasm (binary file)libopus-[encoder | decoder].min.jslibopus-[encoder | decoder].min.mem (binary file)libopus-[encoder | decoder].wasm.min.js
libopus-[encoder | decoder].wasm.min.wasm (binary file)NOTE: recorder.js, as well as the wrapper code decoderWorker.js and
encoderWorker.js are currently only (un-minified) available in
directory src/
(may need to be copied to dist/ or other appropriate location, if they need to be used)
Install via npm registry
npm install opus-encdec
Latest from repository
npm install git+https://github.com/mmig/opus-encdec.git
Variants of the libopus-encoder.js library that are loaded asynchronously do usually also load some additional files.
If the library-file is not loaded from the default location ("page root"), but from a sub-directory/-path, you need to let the library know, so that it searches for the additional files, that it needs to load, in that sub-directory/-path.
For this, the path/location must be stored in the global variable OPUS_SCRIPT_LOCATION before the libopus-encoder.js
library is loaded.
If OPUS_SCRIPT_LOCATION is given as string, it specifies the path to the libopus-encoder.js files (see examples below), e.g.
//location example as string:
OPUS_SCRIPT_LOCATION = 'libs/';
Note, that the path/location should end with a slash ("/"), e.g. 'some/path/'
(however, the library will try to automatically add a slash, if it is missing).
If OPUS_SCRIPT_LOCATION is given as an object, it specifies mappings of the file-names to the file-paths of the libopus-encoder.js files (see examples below), e.g.
//location example as object/mapping:
OPUS_SCRIPT_LOCATION = {
'libopus-encoder.min.js.mem': 'libs/flac.mem'
};
An example for specifying the path/location at libs/ in an HTML file:
<script type="text/javascript">window.OPUS_SCRIPT_LOCATION = 'libs/';</script>
<script src="libs/libopus-encoder.js" type="text/javascript"></script>
Or example for specifying the path/location at libs/ in a WebWorker script:
self.OPUS_SCRIPT_LOCATION = 'libs/';
importScripts('libs/libopus-encoder.js');
Or example for specifying the path/location at libs/ in Node.js script:
process.env.OPUS_SCRIPT_LOCATION = './libs/';
var Flac = require('./libs/libopus-encoder.js');
Example for specifying custom path and file-name via mapping (originalFileName -> <newPath/newFileName>):
in this case, the file-name(s) of the additionally required files (e.g. *.mem or .wasm files)
need to be mapped to the custom path/file-name(s), that is,
for all the required files of the used library variant (see details below).
self.OPUS_SCRIPT_LOCATION = {
'libopus-encoder.min.js.mem': 'libs/libopus-encoder.mem'
// or for wasm:
//'libopus-encoder.wasm.wasm': 'libs/libopus-encoder.wasm'
};
importScripts('libs/libopus-encoder.min.js');
// or for wasm:
// importScripts('libs/libopus-encoder.wasm.js');
OLD DOCUMENTATION: (caution: may be outdated/obsolete)
recorder.jsThe Recorder object is available in the global namespace and supports CommonJS and AMD imports.
var rec = new Recorder([config]);
Creates a recorder instance.
4096.encoderWorker.min.jstrue.0 and 1. Defaults to 01 = mono, 2 = stereo. Defaults to 1. Maximum 2 channels are supported.0 and 1. Defaults to 12048 - Voice, 2049 - Full Band Audio, 2051 - Restricted Low Delay. Defaults to 2049.0 is fastest with lowest complexity. 10 is slowest with highest complexity. The encoder selects a default when this is not specified.20.48000. Supported values are 8000, 12000, 16000, 24000 or 48000.40.16000.0 is fastest with lowest quality. 10 is slowest with highest quality. Defaults to 3.dataAvailable event will fire after each encoded page. Defaults to false.rawOpus encode as raw OPUS (instead of OGG container) frames. Defaults to false.16. Supported values are 8, 16, 24 and 32 bits per sample.rec.close()
close will close the audioContext, destroy the workers, disconnect the audio nodes and close the mic stream. A new Recorder instance will be required for additional recordings. if a sourceNode was provided in the initial config, then the implementation will need to close the audioContext and close the mic stream.
rec.pause([flush])
pause will keep the stream and monitoring alive, but will not be recording the buffers. If flush is true and streamPages is set, any pending encoded frames of data will be flushed, and it will return a promise that only resolves after the frames have been flushed to ondataavailable. Will call the onpause callback when paused. Subsequent calls to resume will add to the current recording.
rec.resume()
resume will resume the recording if paused. Will call the onresume callback when recording is resumed.
rec.setRecordingGain( gain )
setRecordingGain will set the volume on what will be passed to the recorder. Gain is an a-weighted value between 0 and 1.
rec.setMonitorGain( gain )
setMonitorGain will set the volume on what will be passed to the monitor. Monitor level does not affect the recording volume. Gain is an a-weighted value between 0 and 1.
rec.start()
start Begins a new recording. Returns a promise which resolves when recording is started. Will callback onstart when started. start needs to be initiated from a user action (click or touch) so that the audioContext can be resumed and the stream can have audio data.
rec.stop()
stop will cease capturing audio and disable the monitoring and mic input stream. Will request the recorded data and then terminate the worker once the final data has been published. Will call the onstop callback when stopped.
rec.encodedSamplePosition
Reads the currently encoded sample position (the number of samples up to and including the most recent data provided to ondataavailable). For Opus, the encoded sample rate is always 48kHz, so a time position can be determined by dividing by 48000.
Recorder.isRecordingSupported()
Returns a truthy value indicating if the browser supports recording.
Recorder.version
The version of the library.
rec.ondataavailable( arrayBuffer )
A callback which returns an array buffer of audio data. If streamPages is true, this will be called with each page of encoded audio. If streamPages is false, this will be called when the recording is finished with the complete data.
rec.onpause()
A callback which occurs when media recording is paused.
rec.onresume()
A callback which occurs when media recording resumes after being paused.
rec.onstart()
A callback which occurs when media recording starts.
rec.onstop()
A callback which occurs when media recording ends.
Add to your webpack.config.js before all other loaders.
module.exports = {
module: {
rules: [
{
test: /encoderWorker\.min\.js$/,
use: [{ loader: 'file-loader' }]
}
]
}
};
Then get the encoderPath using an import
import Recorder from 'opus-encdec';
import encoderPath from 'opus-encdec/dist/encoderWorker.min.js';
const rec = new Recorder({ encoderPath });
rec.start() to be called from a user initiated event. In iOS and macOS Safari, the mic stream will be empty with no logged errors. In Chrome and Firefox the audioContext could be suspended.Supported:
Unsupported:
Prebuilt sources are included in the dist folder. However below are instructions if you want to build them yourself. Opus and speex are compiled without SIMD optimizations. Performace is significantly worse with SIMD optimizations enabled.
Mac: Install autotools using MacPorts
port install automake autoconf libtool pkgconfig
Windows: Install autotools using MSYS2
pacman -S make autoconf automake libtool pkgconfig
Install npm dependencies:
npm install
checkout, compile and create the dist from sources:
npm run make
Running the unit tests:
npm test
Clean the dist folder and git submodules:
make clean
Copyright 2013 - present © cnpmjs.org | Home |